Статьи

Настройка IBM JVM — политика gencon GC

Эта статья предоставит вам подробную информацию о важности настройки пространства кучи Java при миграции с виртуальной машины Java, такой как HotSpot или JRockit, на IBM JVM . Эта рекомендация по настройке основана на недавнем поручении по устранению неполадок и настройке, которое я выполнил для одного из своих ИТ-клиентов.

Обзор IBM JVM

Как вы, вероятно, видели из моих других статей, IBM JVM отличается от HotSpot JVM в некоторых аспектах, так как у него нет, например, пространства памяти PermGen. С точки зрения сборки мусора, он предоставляет вам продвинутые алгоритмы, которые могут использовать преимущества машины с несколькими физическими ядрами; похож на JVM HotSpot.

С точки зрения устранения неполадок IBM предоставляет вам множество инструментов; включая встроенные возможности создания дампов потоков и дампов кучи из его реализации JVM.

Например, IBM JVM Thread Dump является особенно мощным средством, поскольку он предоставляет вам дополнительные данные о вашей JVM, такие как переменные активной среды JVM, политики GC, загруженные классы в каждом активном загрузчике классов и т. Д. Мы рассмотрим это более подробно в части 4 из нашего учебного плана .

IBM VM — поведение GC по умолчанию

Теперь вернемся к нашей основной теме. Очень важно, чтобы вы понимали поведение по умолчанию сборщика мусора IBM JVM (версии 1.5 и 1.6). По умолчанию пространство кучи Java создается с использованием только постоянной памяти, например, оно не создает отдельное пространство YoungGen (питомник). Это означает, что любое выделение памяти направляется в постоянное пространство (недолговечные и долгоживущие объекты), которое впоследствии получает сборщик по умолчанию (через Full GC).

Ниже приведен подробный снимок GC, показывающий разбивку памяти GC по умолчанию с объяснениями:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<af type="tenured" id="5" timestamp="Mar 01 13:40:30 2012" intervalms="0.000">
 
  <minimum requested_bytes="48" />
 
  <time exclusiveaccessms="0.106" meanexclusiveaccessms="0.106" threads="0" lastthreadtid="0x000000011A846B00" />
 
  <tenured freebytes="20131840" totalbytes="2013265920" percent="0" >
 
    <soa freebytes="0" totalbytes="1993134080" percent="0" />
 
    <loa freebytes="20131840" totalbytes="20131840" percent="100" />
 
  </tenured>
 
  <gc type="global" id="8" totalid="2492" intervalms="2017588.587">
 
    <finalization objectsqueued="199" />
 
    <timesms mark="808.286" sweep="9.341" compact="0.000" total="818.292" />
 
    <tenured freebytes="1362331024" totalbytes="2013265920" percent="67" >
 
      <soa freebytes="1344212368" totalbytes="1995147264" percent="67" />
 
      <loa freebytes="18118656" totalbytes="18118656" percent="100" />
 
    </tenured>
 
  </gc>
 
  <tenured freebytes="1362330976" totalbytes="2013265920" percent="67" >
 
    <soa freebytes="1344212320" totalbytes="1995147264" percent="67" />
 
    <loa freebytes="18118656" totalbytes="18118656" percent="100" />
 
  </tenured>
 
  <time totalms="818.750" />
 
</af>

Хорошо, политика IBM JVM GC по умолчанию отличается … в чем проблема?

Проблема с этой политикой JVM по умолчанию заключается в том, что все объекты Java копируются в постоянное пространство и собираются с помощью глобальной коллекции (Full GC). Для многих приложений Java EE соотношение недолговечных и долгоживущих объектов намного выше. Это означает, что вашей JVM потребуется выполнить довольно много основных коллекций для очистки недолговечных объектов; Результаты: увеличенная частота Full GC, увеличенное время паузы JVM, увеличенная загрузка ЦП и снижение производительности!

Это именно то, что мы наблюдали при выполнении нагрузочного тестирования после перехода на JVM HotSpot 1.5 (с использованием инкрементного и параллельного GC) на IBM JVM 1.6 с политикой GC по умолчанию. Тяжелый процесс GC был идентифицирован как первопричина в соответствии с приведенным выше объяснением.

Решение пожалуйста!

Хорошей новостью является то, что IBM JVM представила сборщик поколений и одновременный сборщик мусора начиная с версии 1.5. Эта политика GC обеспечивает именно то, что мы хотим:

  • Это делит пространство Java Heap между питомником и арендованным пространством
  • Детские (YoungGen) космические объекты собираются отдельно через сборщик мусора GC
  • Арендуемые космические объекты собираются через глобальный сборщик мусора
  • Коллектор GC работает одновременно и использует преимущества любой машины с несколькими физическими ядрами.

Полученные результаты:

  • Снижение основной частоты сбора (Full GC)
  • Сокращенное время полного GC и время паузы
  • Увеличить пропускную способность JVM
  • Повысить производительность и емкость вашего приложения

Вы можете включить его, добавив этот параметр JVM ниже:

1
-Xgcpolicy:gencon

Ниже, что вы можете ожидать в подробном журнале GC после включения этой политики GC:

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
<af type="nursery" id="15" timestamp="Mar 08 05:34:06 2012" intervalms="1289096.227">
 
  <minimum requested_bytes="40" />
 
  <time exclusiveaccessms="0.085" meanexclusiveaccessms="0.085" threads="0" lastthreadtid="0x0000000118113900" />
 
  <refs soft="18043" weak="204057" phantom="27" dynamicSoftReferenceThreshold="32" maxSoftReferenceThreshold="32" />
 
  <nursery freebytes="0" totalbytes="530716672" percent="0" />
 
  <tenured freebytes="1887422016" totalbytes="2013265920" percent="93" >
 
    <soa freebytes="1786758720" totalbytes="1912602624" percent="93" />
 
    <loa freebytes="100663296" totalbytes="100663296" percent="100" />
 
  </tenured>
 
  <gc type="scavenger" id="15" totalid="15" intervalms="1289097.271">
 
    <flipped objectcount="1486449" bytes="129908000" />
 
    <tenured objectcount="1176" bytes="184144" />
 
    <finalization objectsqueued="3082" />
 
    <scavenger tiltratio="73" />
 
    <nursery freebytes="364304408" totalbytes="495208448" percent="73" tenureage="10" />
 
    <tenured freebytes="1886766656" totalbytes="2013265920" percent="93" >
 
      <soa freebytes="1786103360" totalbytes="1912602624" percent="93" />
 
      <loa freebytes="100663296" totalbytes="100663296" percent="100" />
 
    </tenured>
 
    <time totalms="233.886" />
 
  </gc>
 
  <nursery freebytes="364238872" totalbytes="495208448" percent="73" />
 
  <tenured freebytes="1886766656" totalbytes="2013265920" percent="93" >
 
    <soa freebytes="1786103360" totalbytes="1912602624" percent="93" />
 
    <loa freebytes="100663296" totalbytes="100663296" percent="100" />
 
  </tenured>
 
  <refs soft="17992" weak="5344" phantom="27" dynamicSoftReferenceThreshold="32" maxSoftReferenceThreshold="32" />
 
  <time totalms="236.858" />
 
</af>

Пожалуйста, имейте в виду, что все еще возможно, что ваше приложение может не получить выгоду от этой политики GC (большая площадь долгоживущих объектов и т. Д.), Поэтому я рекомендую вам всегда проявлять должную осмотрительность и выполнять надлежащее планирование емкости и нагрузочное тестирование Ваше приложение перед выполнением каких-либо серьезных рекомендаций по настройке.

Вывод

Я надеюсь, что эта статья помогла вам понять политику GC IBM JVM 1.5 / 1.6 по умолчанию и узнать, как ваше приложение Java EE может извлечь выгоду из этой рекомендации по настройке gencon политики GC.

Ссылка: настройка JVM IBM — политика GC gencon от нашего партнера по JCG Пьера-Хьюга Шарбонно в блоге « Шаблоны поддержки Java EE и учебник по Java» .