我记得Java中有一个神奇的命令行选项,用于打开当前执行到控制台的操作。输出看起来像字节码。
-verbose
不匹配,因为它只打印类加载,而此选项输出内存分配,设置局部变量等信息。它非常详细,如“Hello world”的10行。
我在http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp和http://java.sun.com/j2se/1.3/docs/tooldocs/solaris/java.html都没有找到它 我也发现了一些标志here,但大多数只在openjdk或开发模式下工作。也许有一种方法可以在这种开发模式下在Windows上启动java.exe? 或者可能还有另一组标记错过了吗?
答案 0 :(得分:2)
不是你问的问题,但我是java进程id的“kill -3”的忠实粉丝 - 它会转储有关每个线程的所有信息以及它们处于什么状态,它们拥有什么锁定以及他们在等什么锁,等等。
答案 1 :(得分:1)
在Windows上使用Ctrl-Break创建线程转储。
要监视类加载,请使用-verbose:class
进行垃圾回收-verbose:gc
答案 2 :(得分:1)
答案 3 :(得分:1)
我最近一直在使用jvisualvm
;也许这会给你你想要的东西?它可以分析内存和CPU的使用情况,可以转储线程堆栈,甚至可以说服JVM列出正在进行的类加载器活动(通过MBean支持:转到java.lang
→ClassLoading
,选择Attributes
并更新Verbose
;当然,它仍会转储到System.out
。关于这个的好处是你不需要任何东西来启用它(通常);您可以只附加到已经运行的JVM。 (如果你有Java 1.5,请改用jconsole
。)
但请注意,您不太可能获得执行字节码的转储。这是因为HotSpot JIT引擎 - 现在已经存在了几年 - 在执行之前将字节码转换为本机指令,因此在代码实际执行时,根本没有字节码留给仪器报告。从理论上讲,你可能能够构建一个以旧方式工作的特殊虚拟机,但它会非常缓慢(比如过去的糟糕日子)所以你为什么真的想要这样做?