jvm создает дамп кучи, но без нехватки памяти

Я уже добавил аргументы JVM: -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=C:\Temp Иногда после того, как я увидел, что JVM создал файл heapdump, но в файле error.log приложения не сообщается OutOfMemoryError. Мой вопрос, как возможно, что JVM создает файл дампа кучи без каких-либо ошибок. Это может быть проблема с приложением (AEM) или JVM?


person Sam    schedule 15.02.2021    source источник


Ответы (2)


Если вашему приложению не хватает памяти, трудно точно сказать, что произойдет.

Если я правильно понимаю, то могло произойти следующее: во время работы вашего Java-приложения в какой-то момент один из потоков мог вызвать ошибку OutOfMemoryError.

Если в этом приложении нет оператора catch (для OutOfMemoryError, Error, Throwable) или какого-либо другого механизма, например: https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.html#setDefaultUncaughtExceptionHandler(java.lang.Thread.UncaughtExceptionHandler), который регистрируется в файле журнала вашего приложения, вы можете его не увидеть.

Однако может случиться так, что некоторая информация была напечатана либо в stdout, либо в stderr, которые могли (или не могли) быть перенаправлены в какой-то другой файл.

Чтобы увеличить вероятность этого, вы можете использовать что-то вроде: -XX:+CrashOnOutOfMemoryError, которое будет печатать причину, даже если приложение не регистрирует ее. Для получения дополнительной информации или других вариантов см.: https://dzone.com/articles/outofmemoryerror-related-jvm-arguments

Еще более полезным может быть ведение журнала активности и статистики сборщика мусора и их анализ. См. статью Как включить ведение журнала сборщика мусора Java? на странице https://gceasy.io/.

person JohannesB    schedule 18.02.2021

Эти параметры относятся только к JVM и не зависят от приложения. Вряд ли это связано с AEM.

person David J    schedule 16.02.2021