Оптимизация потребления памяти в Java - делаем уборку...
-
Upload
vitebsk-dsc -
Category
Software
-
view
213 -
download
2
Transcript of Оптимизация потребления памяти в Java - делаем уборку...
ОПТИМИЗАЦИЯ
ПОТРЕБЛЕНИЯ ПАМЯТИ В JAVAделаем уборку правильно
12 ноября 2016
Евгений Берлог
EPAM Systems
Senior Software Engineer
2
3
4
ОСОБЕННОСТИ ЗАДАЧИ
# REST + MongoDB
# Жесткие требования к времени ответа
# Stateless
5
УСЛОВИЯ ТЕСТИРОВАНИЯ
# 10000 URL с реального окружения# ~30 вызовов в секунду (реальная нагрузка + 50%)
ЗАМЕРЫ УСПЕШНОСТИ
# Максимальная пауза# Пропускная способность# Частота Full GC
7
Исходные замеры
Максимальная пауза Пропускная способность Частота Full GC1918 мс 99.0 % 5 раз в час
НЕМНОГО ТЕОРИИ
9
Распределение памяти
10
Первая сборка
11
Вторая сборка
12
Как происходит старение
13
Большая сборка
ГИПОТЕЗАО СТАРЕНИИ ОБЪЕКТОВ
ГИПОТЕЗА О СТАРЕНИИОБЪЕКТОВ
Время жизни
Разм
ер
объект
ов
16
НО РЕАЛЬНАЯ ИТЕОРЕТИЧЕСКАЯ
СИТУАЦИИ РАЗЛИЧАЮТСЯ
17
НО РЕАЛЬНАЯ ИТЕОРЕТИЧЕСКАЯ
СИТУАЦИИ РАЗЛИЧАЮТСЯ
КАКМОНИТОРИТЬСИТУАЦИЮ ?
19
-XX:+PrintGCDetails
-XX:+PrintGCTimeStamps
-XX:+PrintTenuringDistribution
20
Вывод детализированного сообщения после каждого
запуска Garbage Collector’а.
-XX:+PrintGCDetails
dsc2016
[PSYoungGen: 1559493K->93696K(1610752K)] 2771413K->1379948K(5106176K), 0.1586049 secs]
21
-XX:+PrintGCTimeStamps
dsc2016
1914.990: [GC[PSYoungGen: 1559493K->93696K(1610752K)] 2771413K->1379948K(5106176K), 0.1586049 secs]
Добавление в каждую GC-запись времени
относительно старта JVM.
22
-XX:+PrintTenuringDistribution
dsc2016
Desired survivor size 134217728 bytes, new threshold 15 (max 15)
Вывод в лог порога старения объектов и необходимого размера Survivor региона.
23
1914.990: [GCDesired survivor size 134217728 bytes, new threshold 1 (max 15)[PSYoungGen: 1559493K->93696K(1610752K)] 2771413K->1379948K(5106176K), 0.1586049 secs] 1932.209: [GCDesired survivor size 136839168 bytes, new threshold 1 (max 15)[PSYoungGen: 1569792K->53234K(1611776K)] 2856044K->1408182K(5107200K), 0.1083012 secs]
dsc2016
-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-XX:+PrintTenuringDistribution
ADAPTIVE SIZE POLICY
26
ADAPTIVE SIZE POLICY – это попытка
JVM реорганизовать память с целью достичь
(#1) уменьшения GC паузы;
(#2) увеличения пропускной способности;
(#3) уменьшения footprint’а.
-XX:AdaptiveSizePolicyOutputInterval=1
27
ЛОГИ GC С ВКЛЮЧЕННЫМ ASP
UseAdaptiveSizePolicy actions to meet *** reduced footprint ***GC overhead (%)
Young generation: 1.26 (attempted to shrink)Tenured generation: 0.00 (no change)Tenuring threshold: (attempted to decrease to balance GC costs) = 2
dsc2016
28
ЛОГИ GC С ВКЛЮЧЕННЫМ ASP
UseAdaptiveSizePolicy actions to meet *** reduced footprint ***GC overhead (%)
Young generation: 1.26 (attempted to shrink)Tenured generation: 0.00 (no change)Tenuring threshold: (attempted to decrease to balance GC costs) = 2
dsc2016
30
Эксперимент #1:Указываем максимальную задержку
-XX:GCTimeRatio=999// по умолчанию 99
-XX:MaxGCPauseMillis=100// по умолчанию не ограничен
32
Результат для максимальной задержки
Максимальная пауза Пропускная способность Частота Full GC2092 мс 99.0 % 5 раз в час
# Выключаем Adaptive Size Policy
# Уменьшаем Old Generation
# Максимум на Eden
# Экспериментально высчитываем Survivor Size
35
Эксперимент #2:Дальше не по правилам
36
Эксперимент #2:Дальше не по правилам
-XX:-UseAdaptiveSizePolicy
-Xmx5G -Xms5G
-Xmn4300M
-XSurvivorRatio=6
38
Результат c выключенным Adaptive Size Policy
Максимальная пауза Пропускная способность Частота Full GC1683 мс 99.3 % 1 раз в 3.5 часов
39
Максимальная пауза Пропускная способность Частота Full GC
Базовые настройки 1918 МС 99.0 % 5 раз в час
Максимальная пауза 2092 МС 99.0 % 5 раз в час
Выключенный ASP 1683 МС 99.3 % 1 раз в 3.5 часов
Промежуточный результат
- Может пора остановиться?
Concurrent Mark Sweep Collector
42
Concurrent Mark Sweep (CMS) Collector
# То же распределение регионов, что и в Parallel
# Тот же алгоритм, что и в Parallel для младшегопоколения
# Часть работы в старшем поколениивыполняется параллельно
# Больше footprint, чем в Parallel
44
Эксперимент #3:Меняем GC!
-XX:+UseConcMarkSweepGC-Xmx5G -Xms5G -Xmn4300M-XX:SurvivorRatio=2
46
Максимальная пауза Пропускная способность Частота Full GC283 мс 99.2 % 1 раз в 4 часа
Результат c новым GC
47
dsc2016
: 1460888K->10522K(1595776K), 0.0049030 secs] 1697910K->247592K(2210176K), 0.0049871 secs]1195.459: [GC1195.459: [ParNewDesired survivor size 74252288 bytes, new threshold 15 (max 15)- age 1: 690016 bytes, 690016 total- age 2: 148448 bytes, 838464 total- age 3: 751056 bytes, 1589520 total...- age 13: 82512 bytes, 3801784 total- age 14: 607816 bytes, 4409600 total- age 15: 1348728 bytes, 5758328 total
Анализ логов CMS
...- age 13: 82512 bytes, 3801784 total- age 14: 607816 bytes, 4409600 total- age 15: 1348728 bytes, 5758328 total
15299.307: [GC [1 CMS-initial-mark: 581268K(839680K)] 1241313K(4142080K), 0.2830091 secs]15306.520: [GC[YG occupancy: 1031447 K (3302400 K)]15306.520: [Rescan (parallel) , 0.2487740 secs]15306.769: [weak refs processing, 0.0012183 secs]15306.770: [scrub string table, 0.0012292 secs] [1 CMS-remark: 581268K(839680K)] 1612715K(4142080K), 0.2518813 secs]
...- age 13: 82512 bytes, 3801784 total- age 14: 607816 bytes, 4409600 total- age 15: 1348728 bytes, 5758328 total
15299.307: [GC [1 CMS-initial-mark: 581268K(839680K)] 1241313K(4142080K), 0.2830091 secs]15306.520: [GC[YG occupancy: 1031447 K (3302400 K)]15306.520: [Rescan (parallel) , 0.2487740 secs]15306.769: [weak refs processing, 0.0012183 secs]15306.770: [scrub string table, 0.0012292 secs] [1 CMS-remark: 581268K(839680K)] 1612715K(4142080K), 0.2518813 secs]
50
Максимальная пауза Пропускная способность Частота Full GCcms 283 МС 99.2 % 1 раз в 4 часаparallel 1681 МС 99.3 % 1 раз в 3.5 часов
CMS vs PARALLEL
51
Почему не G1?
> G1 рекомендуется использовать при размерах heap’а от 6ГБ
53
Эксперимент #4:Используем сборщик G1
-XX:UseG1GC
55
Максимальная пауза Пропускная способность Частота Full GC351 мс 95.9 % ?
Результат c использованием G1
57
Максимальная пауза Пропускная способностьParallel 1681 МС 99.3 %G1 351 МС 95.9 %cms 283 МС 99.2 %
Долгожданный победитель
58
Максимальная пауза ПРопускная способностьParallel 1681 МС 99.3 %G1 351 МС 95.9 %cms 283 МС 99.2 %
Долгожданный победитель