Объекты не завершаются, а поток финализатора ничего не делает

На нашем сервере у нас начались проблемы сOutOfMemoryError, Мы проанализировали дампы кучи с помощью Eclipse Memory Analysis и обнаружили, что многие объекты были удержаны для завершения (около 2/3 кучи):

Мы обнаружили, что это может быть некоторая блокировка метода finalize (). Я нашел несколько сообщений об ошибках этой проблемы (Вот или жеВот), и это всегда проявлялось в стеке потоков Финализатора, что оно где-то было заблокировано. Но в нашем случае эта тема была в ОЖИДАНИИ:

"Finalizer" daemon prio=10 tid=0x43e1e000 nid=0x3ff in Object.wait() [0x43dfe000]
   java.lang.Thread.State: WAITING (on object monitor)
        at java.lang.Object.wait(Native Method)
        - waiting on <0x4fe053e8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:133)
        - locked <0x4fe053e8> (a java.lang.ref.ReferenceQueue$Lock)
        at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:149)
        at java.lang.ref.Finalizer$FinalizerThread.run(Finalizer.java:189)

РЕДАКТИРОВАТЬ:

Затем мы попытались добавить-XX:+UseConcMarkSweepGC, но безуспешно, только частотаOutOfMemoryErrors уменьшились, поэтому мы сначала подумали, что это помогло.

Наконец, мы заподозрили ошибку JVM и обновили ее с OpenJDK 1.6.0_30 до Oracle JDK 1.7.0_51, и проблема исчезла (по крайней мере, так кажется, за последние 4 часа использованная куча не увеличилась). Мы не помним никаких изменений в методе finalize и не обновляли какую-либо библиотеку, за это время произошли лишь незначительные изменения. Проблема не воспроизводится на нашем тестовом сервере с той же конфигурацией, за исключением того, что это 64-битная JVM, а рабочий сервер 32-битный.

Вопрос в том, что может быть причиной того, что Объекты не были завершены иFinalizer поток ожидает следующего объекта? Правильно ли мы проанализировали дамп кучи?

Спасибо за все ответы.

Ответы на вопрос(2)

Ваш ответ на вопрос