Как определить причину глобальной утечки эталонной памяти JNI? - PullRequest
9 голосов
/ 21 июня 2011

Я использую Tomcat, и после остановки моего веб-приложения до сих пор имеется ссылка на экземпляр загрузчика классов моего веб-приложения.Вследствие этого заметный объем памяти (в основном связанный со статическими данными) не будет освобожден.Рано или поздно это приводит к OutOfMemoryError.

. Я взял heap dump и понял, что его держит глобальная ссылка JNI , которая предотвращает , что загрузчик классов будет сборщик мусора .

Мое приложение не использует JNI .Я также не использую Apache Tomcat Native Library .Я использую Sun / Oracle JDK.
Я хотел бы отследить причину / происхождение этой глобальной ссылки.(Я предполагаю, что JVM внутренне ссылается на загрузчик классов - но почему / где?).

Вопрос:

  • Какие подходы / наборы инструментов существуют для достижения этой цели?

ОБНОВЛЕНИЕ

Кажется, что bestsss прав, и глобальные ссылки JNI были введенырежим отладки jvm.Это помогло мне, но не отвечает на вопрос, поэтому мне все еще любопытно получить ответ на вопрос, который может быть полезным в будущем.

Ответы [ 4 ]

18 голосов
/ 27 июня 2011

Помимо очевидного случая: Threads, есть еще один:

Используете ли вы приложение в режиме отладки?

JVM не содержит ссылок ни на один загрузчик классов, кроме системного, но вас это не касается. Остальные ссылки JNI являются либо потоками, либо просто отлаживают удерживаемые объекты (при условии, что вы не используете JNI и не блокируете объекты самостоятельно).

Ссылки JNI - это просто корни, отредактируйте свой ответ и опубликуйте, какие именно объекты хранятся в этих ссылках.

1 голос
/ 02 июля 2011

Первое, что я бы сделал, это запустил -Xcheck:jni и посмотрел, что-нибудь получится. Я не ожидал бы этого; не кажется, что с JNI происходит что-то странное, просто неправильно его используют. Однако в этом хорошо убедиться.

Если вы работаете в Sun JVM, я думаю, вы можете сделать -XX:TraceJNICalls, чтобы получить полный список вызовов JNI по мере их поступления. Это должно позволить вам получить представление о том, какие звонки совершаются, и оттуда работать над тем, что их вызывает, и почему это вызывает проблемы.

0 голосов
/ 02 июля 2011

Вы можете попробовать jstack .

Возможно, одна из перечисленных трассировок стека покажет вам источник глобальной ссылки.

0 голосов
/ 27 июня 2011

Управление миссией JRockit: http://download.oracle.com/docs/cd/E13150_01/jrockit_jvm/jrockit/tools/index.html

Хороший инструмент с графическим интерфейсом, который поможет вам быстро его найти.

...