2010-01-08 6 views
10

У меня возникла проблема с тем, что у меня есть (частичная) программа, которая пытается загрузить класс, но не работает, потому что не может найти этот класс. Глядя на трассировку стека, я не вижу никакой конкретной причины для , почему VM пытается загрузить этот класс в первую очередь. Существуют ли какие-либо инструменты, которые позволят мне понять, почему загружается определенный класс?Java: Поиск * почему * загружен класс

Подсказка: Я уже получаю трассировку стека в точную точку, где JVM пытается загрузить класс (через агента). Однако трассировка стека не содержит номеров строк. Поэтому я знаю только, какой метод запускает загружаемый класс, а не какой оператор. Тогда даже знать это утверждение может быть недостаточно. Один оператор может вызвать загрузку класса разными способами, потому что иногда виртуальной машине требуется загрузить часть транзитивного закрытия классов.

+1

Я не знаком с Java, но как насчет предоставления макета этого класса и в нем смотреть на стек вызовов? Если это возможно на Java, так или иначе. – balpha

+3

Возможно, вы можете разместить Stack Trace здесь, так как кто-то может помочь в этом. –

+0

Это может быть побочный эффект верификатора (см. Java Puzzlers). Но нужно больше информации. –

ответ

19

Запустите свою программу с помощью флагов -XX:+TraceClassLoading и -XX:+TraceClassResolution. Это создаст МНОГО выход, который выглядит следующим образом:

[Loaded com.kdgregory.example.memory.PermgenExhaustion$MyClassLoader from file:/home/kgregory/Workspace/Website/programming/examples/bin/] 
RESOLVE com.kdgregory.example.memory.PermgenExhaustion$MyClassLoader java.net.URLClassLoader 
RESOLVE java.net.URLClassLoader java.lang.Class URLClassLoader.java:188 

Вам нужно проследить цепочку RESOLVE сообщений для конкретного класса. Или, скорее всего, вы увидите ошибку, когда ваша программа пытается загрузить класс, предшествующий сообщениям разрешения для класса, который его загружает).

+0

Это выглядит полезно. Я проверю это, спасибо! – user66237

+0

Оказалось, что я только что был нужен! Сделал мой день! Большое спасибо! – user66237

+0

Точно, что я но обратите внимание на ненаблюдаемых людей, таких как я: если вы слепо выбираете и копируете аргументы «-XX: + TraceClassLoading и -XX: + TraceClassResolution, убедитесь, что вы не копируете« и »между ними, когда используете это. Я не могу поверить, сколько времени мне понадобилось, чтобы выяснить эту ошибку пилота. –

5

Вы можете попробовать инструмент статического анализа, например JDepend, чтобы узнать, какие классы имеют ссылки на этот класс.

+1

Я уже делал это, но зависимости довольно тонкие. Класс, который загружается, не упоминается в методе, который в настоящее время выполняется при загрузке класса. Он должен быть чем-то вроде суперкласса типа поля суперкласса класса приемника некоторого типа в текущем методе ... вы понимаете, что я имею в виду. – user66237

0

загрузчиков классов

Если это envorinment где несколько классов-погрузчики в игре (например, веб-приложение), вы должны быть осторожны. Скажите, пожалуйста, что такое приложение.

ресурс

Скажите нам, где являются банки (вы файл/структуру реж) и какой класс загружается. Вы загружаете его динамически с помощью Class.forName? или используя пружину или другую структуру МОК? Это основной класс?

Некоторые предыдущие испытания (чтобы помочь нам)

Может быть, вы можете проверить некоторые вещи, используя Class.getResource() внутри основного метода. Если вы класс foo.bar.Clazz попробуйте Class.getResource ("/ foo/bar/Clazz.class"), чтобы увидеть, возвращает ли он что-то действительное или нет. Попытайтесь сделать то же самое с классом, который загружает ваш неудачный класс, чтобы узнать, где именно вы ожидаете.

+0

Я уже получаю трассировку стека в точную точку, где JVM пытается загрузить класс (через агента). Однако трассировка стека не содержит номеров строк. Поэтому я знаю только, какой метод запускает загружаемый класс, а не какой оператор. – user66237

+0

Мое намерение состояло в том, чтобы выяснить, был ли класс, вызывающий загрузку проблемного класса, на ожидаемый загрузчик классов (скажем, jar) или другой.Это, конечно, если у вас есть несколько классных загрузчиков ... :( – helios

Смежные вопросы