Обзор 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» .

