Можно ли войти, если класс в JVM используется? - PullRequest
5 голосов
/ 11 февраля 2010

У меня есть Tomcat с работающими приложениями. Я не могу перезапустить Tomcat, но хотел бы отслеживать использование файлов классов.

Я хотел бы войти, если указанный класс используется. Это возможно? Как я мог это сделать?

Использование класса: если создается объект для этого класса или вызываются методы и т. Д.

Уточнение: я не могу перезапустить приложение. Каждое решение с перекомпиляцией работающего кода не приемлемо. Это делает проблему такой сложной.

Удаленная отладка / JMX еще не включена. Это было бы аналогично перекомпиляции приложения для его активации.

Платформа RHEL, 64-разрядная.

Ответы [ 7 ]

1 голос
/ 11 февраля 2010

Я хотел бы войти, если указанный класс используется; то есть, если объект для этого класса создан или методы вызваны и т. д.

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

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

И, конечно, есть и другие способы, которыми класс может быть "использован", который не влечет за собой создание экземпляров или вызов его методов.

Так что в зависимости от того, что вы действительно пытаетесь выяснить, вам может не повезти.

1 голос
/ 11 февраля 2010

Я думаю, вам нужно профилирование для этого. Профилировщик позволит вам увидеть, какие классы используются. Или программисты в фаворе - System.out.println:)

0 голосов
/ 12 февраля 2010

С JRockit JVM вы можете запустить свое приложение с -Xverbose: class = info, чтобы получить информацию о загрузке классов.

0 голосов
/ 11 февраля 2010

Если вы используете Solaris или OS X, возможно, будет включен зонд DTrace.

Кроме этого, если вы не можете подключить отладчик, профилировщик или другой инструмент мониторинга к уже работающей JVM (что зависит от параметров, которые вам нужно было бы указать при запуске), вам не повезло.

0 голосов
/ 11 февраля 2010

Вы можете определить статический блок в классе

class X {
 static {
  System.out.println("class X has been loaded");
 }
 ...
}

, который будет вызван один раз при загрузке объекта класса.

Если вы не можете редактировать код и у вас есть JRE 6, вы можете попробовать инструмент jmap

jmap -histo <pid>

напечатает гистограмму вашей кучи, включая все загруженные классы.

Используя jps вы можете узнать pid

0 голосов
/ 11 февраля 2010

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

Но вы можете подумать, чтобы узнать, вызвав этот метод.

ClassLoader#findLoadedClass()

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

0 голосов
/ 11 февраля 2010

Если у вас есть доступ к исходным файлам, вы можете просто поместить некоторые операторы журнала в конструктор класса (при условии, что создание экземпляров подразумевает использование класса).

Если инстанцирование объекта - это не то, что вы подразумеваете под «использованием файлов классов», то, возможно, вы имеете в виду, что хотите знать, когда класс загружается JVM? Если это так, статические блоки инициализации могут помочь; Вы могли бы поместить там записи журнала.

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