Howto печатать события сбора мусора класса java?


9
 
java version "1.5.0_14" 
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_14-b03) 
Java HotSpot(TM) Server VM (build 1.5.0_14-b03, mixed mode) 

Я пытаюсь отладить исключение NullPointerException, которое я получаю для передачи ссылки на статически определенное поле. Чтобы быть более конкретным, я устанавливаю глобальный экземпляр рабочей памяти Drools3.

workingMemory.setGlobal("log", workingMemorieslog); 

Мое предположение заключается в том, что класс, в котором поле статически определено, является сборкой мусора. (Получающий класс должен использовать WeakReference или что-то в этом роде, я действительно не знаю)

Как бы вы предложили отладить это? Я думаю, что если бы я мог точно знать, когда GC JVM выгружает класс/экземпляр класса, я мог бы сузить причину ошибочного поведения. (Если не точное время события, по крайней мере, указание на то, что что-то произошло).

Спасибо, Maxim.

  0

Хороший вопрос, хорошее наблюдение, хороший ответ. +1 как на вопрос, так и на ответ. 22 фев. 092009-02-22 20:00:14

10

Для отслеживания GC активности добавьте в команду Java:

-verbose: дс -XX: + PrintGCTimeStamps -XX: + PrintGCDetails

NPE, что вы получаете, вероятно, вы передавая пустое значение.

  0

Благодарим за ответ, Я уже работаю с -XX: + PrintGCDTails -verbose: gc -Xnoclassgc, и все же я не вижу никакой информации о загрузке/разгрузке класса. Единственным выходом I se являются такие линии, как: [GC [PSYoungGen: 4096K-> 630K (4736K)] 4096K-> 790K (48064K), 0.0032750 secs] 22 фев. 092009-02-22 00:27:12

  0

Поскольку этот ответ подходит наилучшим образом для первоначальной темы вопроса Я принимаю это как ответ. Спасибо. 22 фев. 092009-02-22 16:31:10


0

У вас есть трассировка стека?

Вы пытались войти в метод setGlobal (при условии, что у вас есть код), чтобы узнать, что происходит?


2

Почему бы не сохранить класс в памяти, а затем посмотреть, если это все еще происходит, если это так, то ваша проблема лежит в другом месте. Если нет, то вы знаете, что проблема заключается в сборе мусора.


1

Оказалось, что затмение является основной проблемой здесь.

поясню:

Я завернуты наш веб-приложение в качестве основного метода(), чтобы проверить производительность. Мы используем много стороннего кода, а именно: общий пул Apache.

Оказывается, у нас было несколько версий банки, распределенных по проектам (проекты затмения). Мое приложение, которое использует эти проекты, имело commons-pool-1.3, у другого проекта был общий пул-1.2.

При загрузке с использованием контейнера сервлетов (Tomcat6) загрузчик класса webapp имел первый приоритет, поэтому он всегда загружал версию webapp. Когда я запустил приложение, используя main() eclipse, в нем не очень мудрое поведение экспортировало зависящие от него проекты jars in -classpath до тех, что в текущем проекте.

Конфликт был между 2 версиями общего пула, что вызвало неопределенное поведение. В объекте заимствование SAMETIMES решило создать новый объект. Я не заглянул в код реализации, я предполагаю, что это связано с удержанием статической карты GenericKeyedObjectPool (проблемным классом). Поскольку новый экземпляр был создан, он действительно содержит нулевую ссылку на упомянутый глобальный.

Решение моей удачи было довольно простым, общий пул используется только моим webapp, поэтому я могу удалить его из всех проектов, на которые ссылаются, в противном случае я бы просто попытался обновить их до одной версии.Если бы я не мог этого сделать, я действительно не знаю, что бы я сделал. Это очень странное значение по умолчанию для eclipse.

Благодарим вас за чтение и помощь.

// ps. 3 дня. Это время, которое я потратил на понимание того, что, черт возьми, я сделал неправильно в моем коде замены сервлетов. Оказывается, я даже не проблема. : P

+1

FYI: Если у вас есть проблемы с ссылкой на объекты, попробуйте logging 'ProblemClass.class.getProtectionDomain(). GetCodeSource(). GetLocation(). ToExternalForm()' Это вернет файл jar или класса, из которого был загружен класс , Это бесценный трюк при отладке веб-приложений, которые часто страдают от проблем без детерминированного класса. 02 янв. 132013-01-02 06:20:21