JPanel принадлежит JNI Global и вызывает исключения OOM - PullRequest
1 голос
/ 03 декабря 2010

Хотелось бы, чтобы у меня было больше контекста к моему вопросу, но, к сожалению, я публикую этот вопрос из отчаяния. Я не могу воспроизвести это с меньшим приложением, поскольку я хотел бы разместить это здесь. К сожалению, все, что я могу сделать, это попытаться объяснить мои симптомы и надеяться, что кто-то там видел нечто подобное.

У меня есть чисто 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, когда происходит перетаскивание. К сожалению, у меня нет решения этой проблемы, но я хотел бы поблагодарить всех тех, кто прислал мне свои предложения при исследовании этой проблемы.

1 Ответ

0 голосов
/ 07 декабря 2010

Если исходный код Java Native Interface не принадлежит вам, вам может понадобиться dispose() ошибочный графический контекст ", если он был создан непосредственно из компонента илиеще один Graphics объект. " Этот RotatableImage является примером, который может протекать без dispose().

...