Подробности выполнения Java в System.out - PullRequest
6 голосов
/ 31 мая 2010

Насколько я помню, в Java есть опция волшебной командной строки, которая включает запись операций, которые в данный момент выполняются на консоли. Вывод был похож на байт-код.

-verbose не совпадает, поскольку печатает только загрузку классов, в то время как эта опция выводит информацию, такую ​​как распределение памяти, установка локальных переменных и т. Д. Это было очень подробно, например, 10 строк для «Hello world».

Я не нашел его ни здесь 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 в этом режиме разработки? Или, может быть, есть другой набор флагов, которые пропускают эти списки?

Ответы [ 4 ]

2 голосов
/ 31 мая 2010

Не совсем то, что вы просили, но я большой поклонник "kill -3" в идентификаторе процесса java - который выводит всю информацию о каждом потоке и в каком состоянии он находится, какие блокировки он удерживает и какие замки они ждут и тому подобное.

1 голос
/ 01 июня 2010

Я недавно использовал jvisualvm; может быть, это даст вам то, что вы хотите? Он выполняет профилирование как использования памяти, так и использования процессора, может выгружать стеки потоков и даже может убедить JVM перечислить, что происходит активность загрузчика классов (с помощью поддержки MBean: перейдите к java.langClassLoading, выберите Attributes и обновление Verbose; оно по-прежнему сбрасывается до System.out, конечно). Самое замечательное в этом то, что вам ничего не нужно, чтобы включить его (обычно); Вы можете просто подключиться к уже работающим JVM. (Если у вас есть Java 1.5, используйте jconsole.)

Обратите внимание, что вы вряд ли получите дамп того, какие байтовые коды выполняются. Это связано с тем, что движок HotSpot JIT, который существует уже несколько лет, преобразует байт-коды в собственные инструкции перед выполнением, поэтому к тому моменту, когда код фактически исполняется, для инструментария для отчета просто не осталось байт-кодов. Теоретически вы могли бы создать специальную виртуальную машину, которая работала бы по-старому, но она была бы ужасно медленной (как в старые добрые времена), так что с чего бы вам этого хотелось?

1 голос
/ 31 мая 2010

Поддерживаемые параметры здесь . Наиболее близким к вашему описанию является -бербос: gc или, возможно, -бербоз: класс .

javap выведет байт-код, но это статический дизассемблер, не связанный со временем выполнения.

1 голос
/ 31 мая 2010

В Windows используйте Ctrl-Break, чтобы создать дамп потока. Для мониторинга загрузки классов используйте -verbose:class для сборки мусора -verbose:gc

...