#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).