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

#java #memory-leaks #aem #heap-memory #heap-dump

#java #утечки памяти #aem #куча-память #куча-дамп

Вопрос:

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

Ответ №1:

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

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

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

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

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

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

Ответ №2:

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