Кто-нибудь знает, как заставить дамп кучи вместо перехода JVM в режим без ответа / очень медленный ответ?
Вам нужно использовать -XX:+UseGCOverheadLimit
. Это говорит GC выбросить OOME (или сбросить кучу, если вы настроили это), когда процент времени, потраченного на сбор мусора, становится слишком высоким. Это должно быть включено по умолчанию для недавней JVM ... но вы, возможно, отключили его.
Вы можете настроить пороги «накладных расходов» для отказа коллектора, используя -XX:GCTimeLimit=...
и -XX:GCHeapFreeLimit=...
; см https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gc-ergonomics.html
Эффект «накладных» ограничений заключается в том, что ваше приложение получает сбои GC раньше. Надеемся, что это позволяет избежать эффекта «смертельной спирали», поскольку сборщик мусора использует все большую долю времени для сбора все меньшего и меньшего количества фактического мусора.
Другая возможность состоит в том, что вашей JVM требуется очень много времени, чтобы сбросить кучу. Это может произойти, если реальная проблема заключается в том, что ваша JVM вызывает перегрузку виртуальной памяти, поскольку использование памяти Java значительно превышает объем физической памяти.