Обзор
Jiangnan Baiyi из компании написал статьюРекомендации по параметрам JVM для критически важных бизнес-систем (2016 Hot Winter Edition)Статьи Даниэля всегда нужно читать внимательно. В этой статье представлено большое количество параметров настройки JVM, а содержание относительно велико. В этой статье перечислены только некоторые параметры, которые я могу понять. Параметры, которые я временно не понимаю, могут быть добавлены только позже, когда я вернусь домой.
Параметры настройки производительности
-XX:AutoBoxCacheMax
При запуске процесса JAVA будет загружен основной пакет rt.jar.Целое число в пакете rt.jar, естественно, загружается в JVM.В Integer есть кеш IntegerCache, как показано ниже:
private static class IntegerCache {
static final int low = -128;
static final int high;
static final Integer cache[];
static {
// high value may be configured by property
int h = 127;
String integerCacheHighPropValue =
sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");
if (integerCacheHighPropValue != null) {
int i = parseInt(integerCacheHighPropValue);
i = Math.max(i, 127);
// Maximum array size is Integer.MAX_VALUE
h = Math.min(i, Integer.MAX_VALUE - (-low) -1);
}
high = h;
cache = new Integer[(high - low) + 1];
int j = low;
for(int k = 0; k < cache.length; k++)
cache[k] = new Integer(j++);
}
private IntegerCache() {}
}
IntegerCache имеет блок статического кода. Когда JVM загружает класс Integer, она сначала загружает статический код. При запуске JVM-процесса числа в диапазоне -128~+127 будут закешированы, а при вызове метода valueOf, если это число из этого диапазона, оно будет взято прямо из кеша.
За пределами этого диапазона может быть создан только новый объект Integer.
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
Таким образом, вы можете установить значение AutoBoxCacheMax в верхний регистр в соответствии с реальной ситуацией, например, рекомендованной Jiangnan Baiyi.
-XX:AutoBoxCacheMax=20000
-XX:+AlwaysPreTouch
Когда процесс JAVA запускается, хотя мы можем указать соответствующий размер памяти для JVM, операционная система фактически не выделяет эту память для JVM, а только когда JVM обращается к памяти, что вызовет следующие проблемы.
1. Во время GC, когда объекты нового поколения нужно продвигать к старому поколению, нужна память, в это время операционная система будет фактически выделять память, что увеличит время паузы молодого GC;
2. Может быть проблема фрагментации памяти.
Его можно настроить при запуске JVM.
-XX:+AlwaysPreTouch
параметры, так что JVM сначала получит доступ ко всей выделенной ей памяти и позволит операционной системе фактически выделить память для JVM.Последующая JVM может беспрепятственно обращаться к памяти.
параметры ГХ
Алгоритм сборки мусора, используемый в JAVA 1.7, по-прежнему относится к CMS, и все параметры, упомянутые ниже, относятся к CMS.
CMSInitiatingOccupancyFraction
Я написал один раньшеАлгоритм сборки мусора Java — CMS (одновременная пометка и очистка),Упоминается что поток сборки мусора будет работать параллельно с потоком приложения.Что делать если памяти старого поколения не хватает при работе потока сборки мусора?Поэтому лучше заранее запустить CMS для сбора мусора (ЦМС ГК).
может быть установлен
CMSInitiatingOccupancyFraction=75
Затем, когда уровень использования старого пространства кучи достигнет 75%, будет выполнена сборка мусора.Значение CMSInitiatingOccupancyFraction по умолчанию равно 92%, что слишком велико.
Параметр CMSInitiatingOccupancyFraction должен использоваться вместе со следующими двумя параметрами, чтобы он вступил в силу.
-XX:+UseConcMarkSweepGC
-XX:+UseCMSInitiatingOccupancyOnly
MaxTenuringThreshold
Новое поколение использует алгоритм копирования для сборки мусора, см.
По умолчанию, после того как молодое поколение выполнит 15 раз молодую сборку мусора, если в области Survivor еще есть живые объекты, то эти объекты могут быть напрямую повышены до старого поколения, но так как новое поколение использует алгоритм копирования, если оставшийся в живых область выживает Если объект слишком длинный, в области выжившего выживет больше объектов, что повлияет на производительность алгоритма копирования и увеличит время паузы молодого gc.Рекомендуется установить его равным 6.
-XX:MaxTenuringThreshold=6
ExplicitGCInvokesConcurrent
Если система использует память вне кучи, например класс Netty DirectByteBuffer, когда вы хотите восстановить память вне кучи, вам нужно вызвать
System.gc()
И этот метод будет выполнять полную сборку мусора, все приложение будет приостановлено, если вы используете сборщик мусора CMS, вы можете установить
-XX:+ExplicitGCInvokesConcurrent
этот параметр изменитьSystem.gc()
Поведение, пусть идет от full gc --> CMS GC, CMS GC собирается параллельно, и в процессе промежуточного выполнения нужно только некоторые этапы остановить мир.
Примечание. Если установлено значение ExplicitGCInvokesConcurrent, не устанавливайте параметр DisableExplicitGC для отключенияSystem.gc()
.
параметры памяти
-Xmx, -Xms
Эти два обычно устанавливаются на 4 г
NewRatio
Большая часть GC приходится на молодой GC нового поколения, поэтому вы можете увеличить долю нового поколения во всей куче.Рекомендуется установить его равным половине и половине, чтобы максимально избежать молодых GC.
-XX:NewRatio=1
Оригинальная ссылка