Настройка на потребителски параметри за стартиране на IntelliJ IDEA / Android Studio
Параметрите могат да се променят, като в IntelliJ IDEA или Android Studio изберете
Help -> Edit Custom VM Options (да не се бърка с gradle.properties),
ако не могат да се запазят – отворете файла в текстов редактор в режим на администратор
Основни параметри на JVM
Ето кратко обяснение на всеки от тях:
Xms2g:
Задава началния размер на heap-а на JVM да е 2 гигабайта. Това е минималният размер, който ще бъде заделен веднага след стартирането на JVM.
-Xmx8g:
Задава максималния размер на heap-а на JVM да е 8 гигабайта. Това е ограничение за максималното количество памет, което JVM може да използва.
-XX:ReservedCodeCacheSize=2g:
Заделя 2 гигабайта за съхранение на компилирания код, като подобрява производителността чрез намаляване на броя на Just-In-Time (JIT) компилациите.
-XX:+IgnoreUnrecognizedVMOptions:
Игнорира непознатите параметри на JVM, което позволява да се избегнат грешки при стартиране с параметри, които не се поддържат в дадената версия на JVM.
-XX:+UseG1GC:
Включва garbage collector-а G1, който е предназначен за оптимизация при големи обеми памет и за минимизиране на закъсненията.
-XX:SoftRefLRUPolicyMSPerMB=50:
Задава времето в милисекунди, през което меките референции (soft references) ще живеят след последния достъп до тях, за всеки мегабайт свободна памет в heap-а.
-XX:CICompilerCount=2:
Задава броя на Just-In-Time (JIT) компилаторите, което може да подобри времето за стартиране и производителността при изпълнение на нов код.
-XX:+HeapDumpOnOutOfMemoryError:
При възникване на грешка поради недостиг на памет ще бъде създаден дъмп на heap-а.
-XX:-OmitStackTraceInFastThrow:
Изключва оптимизацията, при която стекът на трасиране (stack trace) на изключенията може да бъде пропуснат при повтарящи се изключения.
-ea:
Включва проверките на твърденията (assertions) в JVM.
-Dsun.io.useCanonCaches=false:
Изключва кеширането на каноничните пътища, което може да подобри поведението на входа/изхода при промяна на файлове извън JVM.
-Djdk.http.auth.tunneling.disabledSchemes=""":
Разрешава използването на всички схеми за автентикация при тунелиране на HTTP.
-Djdk.attach.allowAttachSelf=true:
Разрешава на виртуалната машина на Java да се прикачва към самата себе си.
-Djdk.module.illegalAccess.silent=true:
Потиска предупрежденията за недопустим достъп до API.
-Dkotlinx.coroutines.debug=off:
Изключва дебъгването на корутините в Kotlin.
-XX:ErrorFile=$USER_HOME/java_error_in_idea_%p.log:
Задава пътя до файла, в който ще се записват грешките на JVM.
-XX:HeapDumpPath=$USER_HOME/java_error_in_idea.hprof:
Указва пътя за запазване на дъмпа на heap-а при възникване на грешка поради недостиг на памет.\
--add-opens:
Тези параметри премахват ограниченията на модулността на Java, като позволяват на библиотеките ASM, използвани за работа с байткод, достъп до вътрешни API.
-javaagent:C:\Program Files\JetBrains\Activate\ja-netfilter.jar=jetbrains:
Указва Java агент, който се вгражда в процеса на JVM за промяна на поведението на приложението.
Управление на паметта и събиране на боклука
Освен тези параметри, които обикновено са зададени по подразбиране, могат да се добавят и други
XX:NewRatio=3:
Задава съотношението между младото и старото поколение на heap-а. Стойност 3 означава, че старото поколение ще е три пъти по-голямо от младото.
-XX:NewSize=512m:
Задава началния размер на младото поколение.
-XX:MaxNewSize=1g:
Задава максималния размер на младото поколение.
-XX:MaxPermSize=350m:
Задава максималния размер на постоянното поколение (permanent generation) за версиите на JVM до 8 (в Java 8 и по-нови този параметър се игнорира, тъй като низовете са преместени в heap-а).
Настройки за производителност и дебъгване
XX:+DisableExplicitGC:
Забранява на системата да извиква събирането на боклука явно чрез System.gc().
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -Xloggc:/path/to/gc.log:
Включва подробен лог на събирането на боклука, което може да помогне при диагностика на проблеми с производителността.
-XX:+UseFastAccessorMethods:
Включва оптимизация на извикванията на прости методи (accessors).
-XX:+UseCompressedOops:
Включва използването на „компресирани“ указатели към обекти за намаляване на използването на памет при 64-битови JVM.
Настройки на интерфейса и потребителското изживяване
Dawt.useSystemAAFontSettings=on:
Включва изглаждане на шрифтовете в стила на операционната система.
-Dswing.aatext=true:
Включва подобрено изглаждане на текста за интерфейс на базата на Swing.
-Dsun.java2d.renderer=sun.java2d.marlin.MarlinRenderingEngine:
Използва Marlin като двигател за 2D рендиране, което може да подобри производителността на изрисуването.
Други опции
Dfile.encoding=UTF-8:
Задава кодировката на файловете на проекта да е UTF-8.
-Didea.paths.selector=AndroidStudio4.0:
Задава папката за настройките на Android Studio, плъгините и логовете, което позволява отделни настройки за различни версии на Android Studio.
-Didea.platform.prefix=AndroidStudio:
Указва префикса на платформата, който може да е необходим за някои плъгини.
Възможни варианти на Garbage Collector
Serial GC (-XX:+UseSerialGC):
Това е най-простият garbage collector, който използва еднонишково събиране както за младото поколение (young generation), така и за старото поколение (old generation) обекти. Този garbage collector може да е подходящ за приложения с ограничени ресурси и малък обем данни.
Parallel GC (-XX:+UseParallelGC):
Използва множество нишки за събиране на боклука в младото поколение, което позволява да се подобри производителността при работа с големи обеми данни и висока производителност на обработката. Това е стандартният garbage collector за многонишкови приложения с голям обем памет.
Concurrent Mark Sweep (CMS) GC (-XX:+UseConcMarkSweepGC):
Предназначен е да съкрати времето на паузите, причинени от събирането на боклука, като изпълнява по-голямата част от работата във фонов режим. Макар че CMS може бързо да обработва heap-а и да съкращава времето на спиране, той може да изразходва повече процесорно време и памет.
Z Garbage Collector (ZGC) (-XX:+UseZGC):
Това е мащабируем garbage collector с ниско време на спиране, предназначен за приложения, които изискват големи обеми памет (стотици гигабайти) и минимално влияние на събирането на боклука върху закъснението. ZGC се стреми да ограничи закъснението до няколко милисекунди или по-малко, дори при работа с големи heap-ове.
Shenandoah GC (-XX:+UseShenandoahGC):
Подобно на ZGC, Shenandoah се стреми да минимизира времето на паузите по време на събирането на боклука, като работи основно паралелно с изпълнението на програмата. Разработен е за намаляване на закъсненията при работа с големи обеми памет.
Настройка на паметта в Android Studio
Параметрите на паметта за Android Studio могат да се настроят в раздела
Settings -> Appearance & Behavior -> System Settings -> Memory Settings
в IntelliJ IDEA към момента на писане на статията тази настройка я нямаше