Поскольку я помню, что существует волшебный параметр командной строки в Java, которые включают запись операций, которые в настоящее время выполняются к консоли. Вывод был кодом байта, на который походят.
-verbose
не соответствует, поскольку это печатает только загрузку класса, в то время как эта информация о выводах опции как выделение памяти, устанавливая локальные переменные и т.д. Это было очень подробно, как 10 строк для "Привет мира".
Я не нашел его ни здесь http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp, ни здесь http://java.sun.com/j2se/1.3/docs/tooldocs/solaris/java.html, Также я нашел некоторые флаги здесь, но большинство из них работает только в openjdk или в разработать режиме. Возможно, существует способ, которым я могу запустить, java.exe в Windows в этом разрабатывает режим? Или возможно существует другой набор флагов, что это перечисляет мисс?
В windows используйте Ctrl-Break для создания дампа потока.
Для мониторинга загрузки классов используйте -verbose:class
для сборки мусора -verbose:gc
Поддерживаемые опции здесь. Ближе всего к вашему описанию я могу найти -verbose:gc, или, возможно, -verbose:class.
javap выведет байткод, но это статический дизассемблер, не имеющий отношения к времени выполнения.
В последнее время я довольно часто использую jvisualvm
; может быть, это даст вам то, что вы хотите? Он выполняет профилирование как памяти, так и использования ЦП, может сбрасывать стеки потоков и даже может убедить JVM перечислить, какие действия загрузчика классов происходят (через поддержку MBean: перейдите на java.lang
→ ClassLoading
, выберите Атрибуты
и обновите Verbose
; он все равно выгружается в System.out
, конечно). Самое замечательное в этом то, что вам не нужно ничего, чтобы включить его (обычно); вы можете просто подключиться к уже запущенным JVM. (Если у вас Java 1.5, используйте вместо него jconsole
.)
Обратите внимание, однако, что вы вряд ли получите дамп того, какие байт-коды выполняются. Это связано с тем, что JIT-движок HotSpot, который существует уже несколько лет, преобразует байт-коды в собственные инструкции перед выполнением, поэтому к тому времени, когда код действительно будет выполнен, для инструментария просто не останется байт-кодов. Теоретически вы могли бы создать специальную виртуальную машину, которая работала бы по-старому, но это было бы ужасно медленно (как в старые добрые времена), поэтому зачем вам это действительно нужно?
Не совсем то, что вы просили, но я большой поклонник "kill -3" для идентификатора процесса Java, который выдает всевозможную информацию о каждом потоке и его состоянии. в том, какие замки они держат и каких ждут, и тому подобное.