Я работаю с командой, разрабатывающей приложение Java GUI, работающее на целевой системе Linux на 1 ГБ.
У нас есть проблема, когда память, используемая нашим Java-процессом, растет бесконечно, пока Linux, наконец, не уничтожит процесс Java.
Наша память о куче здоровая и стабильная. (мы подробно профилировали нашу кучу). Мы также использовали MemoryMXBean для мониторинга использования памяти без использования кучи, поскольку мы полагали, что проблема может быть там. Тем не менее, мы видим, что сообщаемый размер кучи + сообщил, что размер без кучи остается стабильным.
Вот пример того, как номера могут выглядеть при запуске приложения в нашей целевой системе с 1 ГБ ОЗУ (куча и не куча, о которых сообщает MemoryMXBean, общая память, используемая процессом Java, контролируется с использованием верхней команды Linux (резидентной памяти)):
При запуске:
- 200 мегабайт выделенной кучи
- 40 МБ, но не куча
- 320 МБ, используемый java-процессом
Через 1 день:
- 200 мегабайт выделенной кучи
- 40 МБ, но не куча
- 360 МБ, используемый java-процессом
Через 2 дня:
- 200 мегабайт выделенной кучи
- 40 МБ, но не куча
- 400 МБ, используемый java-процессом
Цифры выше - это просто "более чистое" представление о том, как работает наша система, но они довольно точны и близки к реальности. Как вы можете видеть, тренд ясен. После нескольких недель работы приложения система Linux начинает испытывать проблемы из-за нехватки системной памяти. Вещи начинают замедляться. Через несколько часов процесс Java будет убит.
После нескольких месяцев профилирования и попыток понять это, мы все еще не в порядке. Я чувствую, что трудно найти информацию об этой проблеме, так как большинство обсуждений объясняют кучу или другие пулы памяти без кучи. (например, Metaspace и т.д.)
Мои вопросы таковы:
-
Если вы сломаете это, что включает память, используемая в java-процессе? (в дополнение к пулам памяти кучи и без кучи)
-
Какие другие потенциальные источники существуют для утечек памяти? (нативный код? Накладные расходы JVM?) Какие из них, в общем, наиболее вероятные преступники?
-
Как можно контролировать/профилировать эту память? Все, что находится за пределами кучи + без кучи, в настоящее время является для меня черным ящиком.
Любая помощь будет принята с благодарностью.