Как установить значение параметра JVM MaxNewSize? Эргономика?

Информация о моем сервере:

  • Процессор:Intel Xeon E5-2630
  • Память:65970676K
  • ОС:Centos 6.4
  • Ядро:3.8.0
  • JDK: HotSpot JDK 1.6.0.27

я использую jmap -heap pid распечатать информацию о куче:

Heap Configuration:
MinHeapFreeRatio = 40
MaxHeapFreeRatio = 70
MaxHeapSize      = 21474836480 (20480.0MB)
NewSize          = 21757952 (20.75MB)
MaxNewSize       = 174456832 
OldSize          = 65404928 (62.375MB)
NewRatio         = 7
 SurvivorRatio    = 8
PermSize         = 268435456 (256.0MB)
MaxPermSize      = 268435456 (256.0MB)

И ниже приведены аргументы JVM, которые я определил для запуска своего приложения:

 -verbose:gc  -XX:+UseMembar -XX:+PrintGCDetails - 
 XX:+PrintGCTimeStamps  -XX:+DisableExplicitGC - 
 XX:+CMSClassUnloadingEnabled
-XX:-OmitStackTraceInFastThrow  -Xloggc:/export/logs/gc.log 
-XX:PermSize=256m -XX:MaxPermSize=256m -Xms6G  -Xmx12G

Я не ставлю MaxNewSizeЯ пытался использовать java -XX:+PrintFlagsFinal распечатать все аргументы JVM и нашел MaxNewSize очень очень большое число: 18446744073709486080, Я думаю, что эргономика, возможно, установила MaxNewSize в 174456832 для меня. Тем не менее, у меня есть другой сервер, который имеет такое же оборудование и программное обеспечение, где MaxNewSize является 392560640 в то время как другие параметры кучи такие же.

Что является основой для эргономики, устанавливающей значение MaxNewSize? Могу ли я увидеть это в исходном коде эргономики?

Я думаю, что я нашел, где значение MaxNewSize установлено:Arguments.cpp (hotspot\src\share\vm\runtime)

if (CMSUseOldDefaults) {  // old defaults: "old" as of 6.0
  if FLAG_IS_DEFAULT(CMSYoungGenPerWorker) {
    FLAG_SET_ERGO(intx, CMSYoungGenPerWorker, 4*M);
  }
  young_gen_per_worker = 4*M;
  new_ratio = (intx)15;
  min_new_default = 4*M;
  tenuring_default = (intx)0;
} else { 
  // new defaults: "new" as of 6.0
  young_gen_per_worker = CMSYoungGenPerWorker;
  new_ratio = (intx)7;
  min_new_default = 16*M;
  tenuring_default = (intx)4;
}

// Preferred young gen size for "short" pauses
const uintx parallel_gc_threads =
(ParallelGCThreads == 0 ? 1 : ParallelGCThreads);

 const size_t preferred_max_new_size_unaligned =
    ScaleForWordSize(young_gen_per_worker * parallel_gc_threads);
  const size_t preferred_max_new_size =
align_size_up(preferred_max_new_size_unaligned, os::vm_page_size());

1 ответ

В JDK 5 была добавлена ​​новая функция производительности для самонастройки JVM, известная как эргономика JVM. Это также в JDK 6. Идея состоит в том, что, когда процесс Java запускается, он может исследовать базовые системные ресурсы и автоматически определять некоторые параметры настройки в случае, если определенные параметры не установлены. Другими словами, он пытается обеспечить хорошую производительность от JVM с минимальной настройкой командной строки.

Поколение: Начиная с J2SE Platform версии 1.2, виртуальная машина включала в себя ряд различных алгоритмов сбора мусора, которые объединяются с использованием сбора поколений. В то время как наивный сборщик мусора проверяет каждый живой объект в куче, сборка поколений использует несколько эмпирически наблюдаемых свойств большинства приложений, чтобы избежать дополнительной работы.

Генерация размеров Ряд параметров влияет на размер генерации. При инициализации виртуальной машины все пространство для кучи резервируется. Размер зарезервированного пространства можно указать с помощью опции -Xmx. Если значение параметра -Xms меньше значения параметра -Xmx, не все зарезервированное пространство немедленно выделяется виртуальной машине. Незаполненное пространство помечается как "виртуальное". Различные части кучи (постоянное поколение, постоянное поколение и молодое поколение) могут увеличиваться до предела виртуального пространства по мере необходимости.

Некоторые параметры являются отношениями одной части кучи к другой. Например, параметр NewRatio обозначает относительный размер временного поколения для молодого поколения.

Молодое поколение Вторым наиболее влиятельным регулятором является доля кучи, предназначенной для молодого поколения. Чем больше молодое поколение, тем реже встречаются мелкие коллекции. Тем не менее, для ограниченного размера кучи молодое поколение большего размера подразумевает меньшее поколение, которое увеличит частоту крупных коллекций. Оптимальный выбор зависит от времени жизни объектов, выделенных приложением.

По умолчанию размер молодого поколения контролируется NewRatio. Например, установка -XX:NewRatio=3 означает, что соотношение между молодым и постоянным поколением составляет 1:3. Другими словами, объединенный размер пространств eden и Survivor будет составлять одну четвертую от общего размера кучи.

Параметры NewSize и MaxNewSize ограничивают размер молодого поколения снизу и сверху. Установка их равными друг другу исправляет молодое поколение, так же как установка -Xms и -Xmx равных фиксирует общий размер кучи. Это полезно для настройки молодого поколения с более высокой степенью детализации, чем целочисленные кратные, разрешенные NewRatio.

Если вам нужна дополнительная информация по этой теме, вот несколько полезных ссылок:

Другие вопросы по тегам