Roman Kryvolapov Engineering Blog

Налаштування кастомних параметрів запуску IntelliJ IDEA / Android Studio

Параметри можна змінити, вибравши в IntelliJ IDEA або Android Studio
Help -> Edit Custom VM Options (не плутати з gradle.properties),
якщо їх не можна зберегти- відкрийте в текстовому редакторі в режимі адміністратора

Основні параметри JVM

Ось невелике пояснення кожного:

Xms2g:
Встановлює початковий розмір купи JVM рівним 2 гігабайтам. Це мінімальний розмір, який буде виділено одразу після запуску JVM.

-Xmx8g:
Задає максимальний розмір купи JVM рівним 8 гігабайтам. Це обмеження на максимальну кількість пам'яті, яку може використовувати JVM.

-XX:ReservedCodeCacheSize=2g:
Виділяє 2 гігабайти для зберігання скомпільованого коду, покращуючи продуктивність за рахунок зменшення кількості компіляцій Just-In-Time (JIT).

-XX:+IgnoreUnrecognizedVMOptions:
Ігнорує невідомі параметри JVM, що дозволяє уникнути помилок під час запуску з параметрами, які не підтримуються в цій версії JVM.

-XX:+UseG1GC:
Вмикає збирач сміття G1, який призначений для оптимізації великих обсягів пам'яті та мінімізації затримок.

-XX:SoftRefLRUPolicyMSPerMB=50:
Встановлює час у мілісекундах, який м'які посилання житимуть після останнього доступу до них для кожного мегабайта вільної пам'яті в купі.

-XX:CICompilerCount=2:
Задає кількість компіляторів Just-In-Time (JIT), що може покращити час старту та продуктивність під час запуску нового коду.

-XX:+HeapDumpOnOutOfMemoryError:
У разі виникнення помилки через нестачу пам'яті буде створено дамп купи.

-XX:-OmitStackTraceInFastThrow:
Вимикає оптимізацію, за якої стек трасування винятків може бути опущений для повторюваних винятків.

-ea:
Вмикає перевірки тверджень у 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:
Вказує шлях для збереження дампа купи при виникненні помилки через нестачу пам'яті.\

— add-opens:
Ці параметри усувають обмеження модульності Java, дозволяючи доступ до внутрішніх API бібліотекам ASM, які використовуються для роботи з байт-кодом.

-javaagent:C:\Program Files\JetBrains\Activate\ja-netfilter.jar=jetbrains:
Вказує на агента Java, який вбудовується в процес JVM для змін

Керування пам'яттю та збиранням сміття

Крім цих параметрів, які зазвичай вказані за замовчуванням, також можна додати й інші

XX:NewRatio=3:
Встановлює співвідношення між молодим поколінням і старим поколінням купи. Значення 3 означає, що старе покоління буде втричі більшим за молоде покоління.

-XX:NewSize=512m:
Встановлює початковий розмір молодого покоління.

-XX:MaxNewSize=1g:
Встановлює максимальний розмір молодого покоління.

-XX:MaxPermSize=350m:
Встановлює максимальний розмір постійного покоління для JVM версій до 8 (у Java 8 і вище цей параметр ігнорується через переміщення рядків у купу).

Налаштування продуктивності та налагодження

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):
Це найпростіший збирач сміття, який використовує однопотокове збирання як для молодого покоління (young generation), так і для старого покоління (old generation) об'єктів. Цей збирач може бути придатним для застосунків з обмеженими ресурсами та невеликим обсягом даних.

Parallel GC (-XX:+UseParallelGC):
Використовує багато потоків для збирання сміття в молодому поколінні, що дозволяє покращити продуктивність при роботі з великими обсягами даних і високою продуктивністю обробки. Це стандартний збирач сміття для багатопотокових застосунків з великим обсягом пам'яті.

Concurrent Mark Sweep (CMS) GC (-XX:+UseConcMarkSweepGC):
Призначений для скорочення часу пауз, викликаних збиранням сміття, за рахунок виконання більшої частини роботи у фоновому режимі. Хоча CMS може швидко обробляти купу та скорочувати час зупинки, він може споживати більше ресурсів процесора та пам'яті.

Z Garbage Collector (ZGC) (-XX:+UseZGC):
Це масштабований збирач сміття з низьким часом зупинки, призначений для застосунків, що потребують великих обсягів пам'яті (сотні гігабайтів) і мінімального впливу збирання сміття на затримку. ZGC прагне обмежити затримку до кількох мілісекунд або менше, навіть при роботі з великими купами.

Shenandoah GC (-XX:+UseShenandoahGC):
Подібно до ZGC, Shenandoah прагне мінімізувати час пауз під час збирання сміття, працюючи здебільшого паралельно з виконанням програми. Він розроблений для зменшення затримок при роботі з великими обсягами пам'яті.

Налаштування пам'яті в Android Studio

Налаштувати параметри пам'яті для Android Studio можна у вкладці
Settings -> Appearance & Behavior -> System Settings -> Memory Settings
в IntelliJ IDEA на момент написання статті цього налаштування не було

Copyright: Roman Kryvolapov