Это может произойти, когда накладные расходы G C настолько велики, что приложение тратит почти все время на домашнюю деятельность G C (98%) . Тем самым нормальное функционирование приложения нарушается, и оно перестает отвечать на запросы. Вместо того, чтобы продолжать это, JVM издает это предупреждение об ошибке, которое необходимо учитывать.
Обычно происходит, когда:
- Размер кучи был ограничен для объектов, созданных как при обычной обработке приложения
- Произошла утечка памяти (кажется, что ее нет согласно VisualVM)
Я видел G C тратить циклы и почти весь процессор, когда совокупный размер объектов и других данных превышает около 80% кучи памяти. Это привело к G C, и это не могло вернуть много, приводя к другому G C и так далее.
Короче говоря, если вы уверены, что утечки памяти нет, первое, что вы должны попробовать:
- Увеличить размер кучи.
А также попытайтесь выяснить объекты, которые создаются приложением при запуске варианта использования. Вы можете уменьшить это число? Я помню, что одним из вариантов использования было чтение файла JSON. Вместо того, чтобы читать файл и создавать миллионы JSON объектов в куче, можно выполнить потоковую передачу файла (как во входных потоках) и прочитать его, создать объект, обработать его (и удалить после вычисления) и перейти к следующему .
Вы можете указать другой алгоритм G C (как указано в другом месте), но это не решит проблему в этом случае. Похоже, что проблема заключается в том, что приложение и OOM не отвечают, а не просто из-за более высокой задержки ответов приложения. Надеюсь, это поможет.