Хотелось бы, чтобы у меня было больше контекста к моему вопросу, но, к сожалению, я публикую этот вопрос из отчаяния. Я не могу воспроизвести это с меньшим приложением, поскольку я хотел бы разместить это здесь. К сожалению, все, что я могу сделать, это попытаться объяснить мои симптомы и надеяться, что кто-то там видел нечто подобное.
У меня есть чисто Java-приложение, которое получает исключения OutOfMemoryException на некоторых клиентских компьютерах. Я предоставляю 400 Мб пространства кучи Java, но, к сожалению, мы все еще видим эту проблему. Получив дамп кучи из моего приложения до его сбоя, я вижу, что существует необычно большое количество объектов JPanel. Глядя на дамп кучи, интересно, что входящая ссылка на мою панель ONLY - это «Глобальная ссылка JNI». Что меня смущает, так это зачем вообще глобальная ссылка на JPanel JNI ? У меня только один кадр. При каких обстоятельствах java потребуется для создания глобальной ссылки JNI на JPanel?
Хотя у меня есть одна теория, она не основана на том, что я прочитал, но у меня возникает ощущение, что поток финализатора заблокирован. К сожалению, у меня нет дампа потока, чтобы доказать это. Моя теория состоит в том, что моя jpanel была поставлена в очередь для сбора мусора, однако, как только она вошла в очередь, сама очередь не может обработать это.
Кто-нибудь готов поделиться своей теорией или внутренним инстинктом? Так как я не могу воспроизвести это на своей машине, мне немного надеты наручники в связи с анализом этой теории. Однако, если кто-то захочет дать мне другой способ расследования, я буду более чем благодарен.
EDIT:
У меня есть небольшое обновление об этом. Мое приложение также использует перетаскивание и, анализируя дамп кучи, я заметил, что существует столько же объекта java.awt.datatransfer.Transferable (который передает мой JPanel как часть передаваемого), так как есть JPanels, которые не имеют был убран Что интересно, единственная ссылка на Переносимый объект снова - JNI Global. Это заставляет меня задуматься, не заблокирован ли финализатор при очистке JPanels, а при очистке перетаскиваемого объекта.
EDIT:
Так что, если кому-то было интересно, я думаю, что я определил проблему. Итак, что-то, что я пропустил в исходном посте, было приложением, внедряющим HTML-страницу с использованием библиотек COM Windows IE (с использованием сторонней библиотеки). В любом случае оказывается, что либо сторонняя библиотека, либо библиотека IE COM сама захватывает глобальную ссылку JNI, когда происходит перетаскивание. К сожалению, у меня нет решения этой проблемы, но я хотел бы поблагодарить всех тех, кто прислал мне свои предложения при исследовании этой проблемы.