Roman Kryvolapov Engineering Blog

Настройка на потребителски параметри за стартиране на 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 към момента на писане на статията тази настройка я нямаше

Copyright: Roman Kryvolapov