6

我记得在 Java 中有一个神奇的命令行选项,可以打开当前执行到控制台的操作的写入。输出看起来像字节码。

-verbose不匹配,因为它只打印类加载,而此选项输出诸如内存分配、设置局部变量等信息。它非常详细,例如“Hello world”的 10 行。

我在这里没有找到它https://www.oracle.com/java/technologies/javase/vmoptions-jsp.html或在这里https://docs.oracle.com/javase/1.5.0/docs/tooldocs/ solaris/java.html。我还发现了一些标志,但大多数只在 openjdk 或开发模式下工作。也许有一种方法可以在这种开发模式下在 Windows 上启动 java.exe?或者这些列表可能缺少另一组标志?

4

4 回答 4

2

不是你问的那样,但我是 java 进程 id 上“kill -3”的忠实粉丝——它会转储关于每个线程的各种信息以及它们处于什么状态、它们持有什么锁以及它们使用什么锁正在等待,诸如此类。

于 2010-05-31T16:15:29.637 回答
1

在 Windows 上使用 Ctrl-Break 创建线程转储。监视 -verbose:class垃圾收集的类加载使用-verbose:gc

于 2010-05-31T16:19:39.237 回答
1

此处支持的选项。我能找到的最接近您的描述的是-verbose:gc,或者可能是-verbose:class

javap将输出字节码,但它是一个静态反汇编程序,与运行时无关。

于 2010-05-31T16:20:47.160 回答
1

我最近一直在使用jvisualvm很多;也许这会给你你想要的?它对内存和 CPU 使用进行分析,可以转储线程堆栈,甚至可以说服 JVM 列出正在发生的类加载器活动(通过 MBean 支持:转到java.lang→<code>ClassLoading,选择Attributes和更新Verbose;它仍然会转储System.out当然)。这样做的好处是您不需要任何东西来启用它(通常);您可以附加到已经运行的 JVM。(如果您有 Java 1.5,请jconsole改用。)

但是请注意,您不太可能得到执行的字节码的转储。这是因为 HotSpot JIT 引擎(已经存在了几年)在执行之前将字节码转换为本机指令,因此在代码实际执行时,根本没有字节码可供仪器报告。从理论上讲,您可能能够构建一个以旧方式工作的特殊 VM,但它会非常缓慢(就像过去糟糕的日子一样),那么您为什么真的想要呢?

于 2010-06-01T08:12:35.337 回答