Изучение Java JIT Другая память - PullRequest
0 голосов
/ 31 августа 2018

Я исследую проблемы нехватки памяти с Java-приложением, запущенным в докер-контейнере, организованном mesos marathon.

  • контейнер установлен на 2 ГБ памяти
  • Куча JVM явно установлена ​​на 1 ГБ мин. И 1,5 ГБ макс.
  • постоянная рабочая нагрузка, а затем возможный код выхода из контейнера 137 (OOM).
  • сравнил два javacores в начале теста и через 1 час заметил, что что-то под названием JIT "Other" имеет наибольшую дельту
  • проблем с использованием кучи JVM не обнаружено

Первый

2MEMUSER      +--JIT: 318,789,520 bytes / 778 allocations
2MEMUSER       |  |
3MEMUSER       |  +--JIT Code Cache: 268,435,456 bytes / 1 allocation
2MEMUSER       |  |
3MEMUSER       |  +--JIT Data Cache: 16,777,728 bytes / 8 allocations
2MEMUSER       |  |
3MEMUSER       |  +--Other: 33,576,336 bytes / 769 allocations

через 1 час

2MEMUSER      +--JIT: 525,843,728 bytes / 8046 allocations
2MEMUSER       |  |
3MEMUSER       |  +--JIT Code Cache: 268,435,456 bytes / 1 allocation
2MEMUSER       |  |
3MEMUSER       |  +--JIT Data Cache: 62,916,480 bytes / 30 allocations
2MEMUSER       |  |
3MEMUSER       |  +--Other: 194,491,792 bytes / 8015 allocations

Я хотел знать, может ли дамп ядра с помощью Eclipse Memory Analyzer Tool (MAT) пролить свет на то, что находится в этом «другом» пространстве.

Мы попытались ограничить использование памяти JIT, следуя этому обсуждению

*-Xjit:disableCodeCacheConsolidation
-Xcodecachetotal128m*

но не могу заставить работать аргументы.

Мы используем IBM JRE 1.8.0 Linux amd64-64 (сборка 8.0.5.17 - pxa6480sr5fp17-20180627_01 (SR5 FP17))

Может, кто-нибудь поделится инструментами / опытом устранения неполадок, связанных с использованием памяти JIT?

1 Ответ

0 голосов
/ 31 августа 2018

У вас может быть утечка памяти в памяти "metaspace". Это память вне кучи, которая используется JVM для хранения (например) JIT-скомпилированных классов и других метаданных класса.

Несколько распространенных причин утечек в метапространстве:

  • утечки из загрузчика классов в результате повторной горячей загрузки кода во время разработки или
  • утечек Proxy классов / объектов или подобных.

Существуют опции JVM, которые могут ограничивать размер метапространства; например -XX:MaxMetaspaceSize=256m.


Вот вопросы и ответы по диагностике утечек в метапространстве:


Я только что заметил, что вы используете IBM JRE, а не Oracle / OpenJDK. Таким образом, вышесказанное не имеет прямого отношения.

Впрочем, основная проблема может быть та же: утечка через загрузчики классов / горячую загрузку или через прокси-классы.

...