Обнаружение OutOfMemoryError — неожиданное поведение при использовании G1

#java #memory-management #out-of-memory #g1gc

#java #управление памятью #нехватка памяти #g1gc

Вопрос:

После прочтения статьи Обнаружение Java OutOfMemoryError до того, как это произойдет, мы решили реализовать такое обнаружение нехватки памяти в нашем проекте. К сожалению, с G1 GC это работает не так, как ожидалось.

Используемый javadoc MEMORY_COLLECTION_THRESHOLD_EXCEEDED говорит
Тип уведомления, обозначающий, что использование памяти пула памяти больше или равно его пороговому значению использования коллекции после того, как виртуальная машина Java потратила усилия на переработку неиспользуемых объектов в этом пуле памяти. Это уведомление выдается MemoryMXBean . Значением этого типа уведомления является java.management.memory.collection.threshold.exceeded .

При использовании G1 GC упомянутое expended effort in recycling unused objects не означает полного GC. Измерение использования памяти выполняется слишком часто, а не только после полной сборки. Это может привести к преждевременному обнаружению нехватки памяти.

Сталкивались ли вы с подобной проблемой? Есть ли у вас какое-либо решение для этого?

Комментарии:

1. По крайней мере, сбор в старом поколении должен был произойти, чтобы порог сбора был превышен и уведомлен. Чистая молодая коллекция не может вызвать уведомление. Кроме того, похоже, что это вопрос правильного порога, т. Е. Порог уведомления должен быть (значительно) выше порога, который запускает параллельную коллекцию (0.65 IIRC).