Интерпретация вывода jstat после настройки размера кучи JVM - PullRequest
3 голосов
/ 07 февраля 2012

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

JVM (1.5.0_16) запускается с -server -Xms2048m -Xmx2048m -XX:NewRatio=2. Он работает на хосте Solaris 5.10 amd64. Около 10 ГБ свободной памяти. Итак, из того, что я прочитал, JVM должна иметь возможность использовать все 2 ГБ пространства кучи.

Наблюдение jstat -gcutil Я наблюдал, как все поколения заполнялись несколько раз, вызывая сборку мусора. E.g.:

Timestamp         S0     S1     E      O      P     YGC     YGCT    FGC    FGCT     GCT
        66150.4   0.00  51.09  56.95  90.33  54.85   6291   58.922     7   22.826   81.748

То, что я думал, заставило бы JVM расширить все поколения до их полного размера. Тем не менее, jstat -gccapacity производит:

 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC      PGCMN    PGCMX     PGC       PC     YGC    FGC
700416.0 700416.0  86016.0 1408.0 1408.0  39104.0  1398784.0  1398784.0  1398784.0  1398784.0  16384.0  65536.0  38912.0  38912.0   6338     7

Последующие прогоны показывают изменение значения NGC / S0C / S1C / EC:

 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC      PGCMN    PGCMX     PGC       PC     YGC    FGC
700416.0 700416.0  86016.0 1472.0 1472.0  39104.0  1398784.0  1398784.0  1398784.0  1398784.0  16384.0  65536.0  38912.0  38912.0   6380     7
700416.0 700416.0 106496.0 1792.0 1856.0  97024.0  1398784.0  1398784.0  1398784.0  1398784.0  16384.0  65536.0  38912.0  38912.0   6433     7
700416.0 700416.0 106496.0 1792.0 1792.0  96064.0  1398784.0  1398784.0  1398784.0  1398784.0  16384.0  65536.0  38912.0  38912.0   6436     7

Из того, что я понимаю, цифры мощности - это общий размер генерации, а цифры использования показывают распределение внутри генерации. Таким образом, приведенный выше результат говорит мне о том, что объединенные новые минимальные и максимальные емкости как (NGCMN / MGCMX) составляют 684 МБ, так и старые минимальные и максимальные емкости составляют 1366 МБ (OGCMN / OGCMX). Что меня смущает, так это возможности новых поколений. Итак, мои вопросы:

  1. Почему EC + S0C + S1C == NGC? (41 920! = 86016)
  2. Почему NGC значительно меньше, чем NGCMN / MGCMX?
    • Это из-за того, что максимальный размер кучи находится под ударом (из-за этого NGC + OGC + PGC будет равен 1488 МБ), если так, что вызовет нижний предел? Вся документация, которую я могу найти, говорит, что 64-битная JVM Solaris должна иметь возможность использовать 4 ГБ.
  3. Если достигается максимальный размер кучи, почему новые поколения изменяют свою мощность (либо все увеличиваются, либо все уменьшаются) без изменения старшего поколения для компенсации).

Другие потенциально полезные результаты jstat:

$ jstat -gcnew 20167
 S0C    S1C    S0U    S1U   TT MTT  DSS      EC       EU     YGC     YGCT
1536.0 1600.0 1300.3    0.0 13  15 1600.0  82880.0  30892.6   6482   60.540

$ jstat -gcnewcapacity 20167
  NGCMN      NGCMX       NGC      S0CMX     S0C     S1CMX     S1C       ECMX        EC      YGC   FGC
  700416.0   700416.0   106496.0   1472.0 233472.0 233472.0   1408.0   700288.0    81088.0  6489     7

$ jstat -gcold 20167
   PC       PU        OC          OU       YGC    FGC    FGCT     GCT
 38912.0  21426.5   1398784.0   1375651.6   6503     7   22.826   83.627

$ jstat -gcoldcapacity 20167
   OGCMN       OGCMX        OGC         OC       YGC   FGC    FGCT     GCT
  1398784.0   1398784.0   1398784.0   1398784.0  6517     7   22.826   83.779

$ jstat -gcpermcapacity 20167
  PGCMN      PGCMX       PGC         PC      YGC   FGC    FGCT     GCT
   16384.0    65536.0    38912.0    38912.0  6531     7   22.826   83.925

1 Ответ

2 голосов
/ 09 февраля 2012

Оказывается, это умышленное поведение коллектора пропускной способности:

Настройка сборки мусора с помощью виртуальной машины Java [tm] 5.0> 5.2.2.2 Настройка размеров генерации

Статистика (например, среднее время паузы), сохраняемая сборщиком, обновляется в конце коллекции. Тесты, чтобы определить, является ли затем были достигнуты цели и любые необходимые корректировки размер поколения сделан.

Наблюдение за емкостями ГХ, когда JVM находится под пиковой нагрузкой, действительно показывает, что совокупные значения тока молодого поколения равны минимальным / максимальным значениям емкости.

...