java vm:如何记录 class 卸载

java vm: how to log class unloading

我无法通过 SO 和网络搜索工作方式找到 Java VM (JVM) 参数的使用以记录 class 卸载。

这里http://www.herongyang.com/JVM/ClassLoader-JVM-Option-verbose-class.html建议调用java -verbose:class -version,但是据说是加载,只给加载日志。

Java HotSpot VM Options:

-XX:-TraceClassUnloading Trace unloading of classes. -XX:-TraceClassLoading Trace loading of classes.

java -XX:-TraceClassUnloading -version 在 classes:

上没有输出任何信息
[0.004s][warning][arguments] -XX:-TraceClassUnloading is deprecated. Will use -Xlog:class+unload=off instead.
java version "13" 2019-09-17
Java(TM) SE Runtime Environment (build 13+33)
Java HotSpot(TM) 64-Bit Server VM (build 13+33, mixed mode, sharing)

和:

java -XX:-TraceClassLoading -version
[0.002s][warning][arguments] -XX:-TraceClassLoading is deprecated. Will use -Xlog:class+load=off instead.
java version "13" 2019-09-17
Java(TM) SE Runtime Environment (build 13+33)
Java HotSpot(TM) 64-Bit Server VM (build 13+33, mixed mode, sharing)

同样的事情。

附带问题:已弃用的词表示气馁,而不是不再工作,为什么会有这种行为?

但是对于 class 加载 java -Xlog:class+load -version 输出信息,例如

[0.037s][info][class,load] java.nio.CharBuffer source: shared objects file
[0.037s][info][class,load] java.nio.HeapCharBuffer source: shared objects file
[0.037s][info][class,load] java.nio.charset.CoderResult source: shared objects file

但是java -Xlog:class+unload -version只有版本信息。

如何获取 class Java VM HotSpot (and/or OpenJDK) 的卸载日志?

你这么说

java -XX:-TraceClassUnloading -version 

不输出有关 classes 的信息。但是我不知道为什么期望它提供信息。

如果 JVM 已启动并且 classes 已加载和卸载,您只会看到日志记录:

  • -version 选项的文档说:

    -version Displays version information and then exits.

    并不是说启动了 JVM。

    删除 -version/

  • 自 Java 9 起,-XX:-TraceClassUnloading 已弃用。您可以将其替换为 -Xlog:class+load=info.

  • 假设 JVM 已启动,并且 classes 已加载,classes 不会在正常的 Java 应用程序中卸载。 Class 卸载仅在以下情况发生:

    1. 创建了一个额外的 classloader,并且
    2. 那个classloader是用来加载classes的,而
    3. 那些 classes 和 classloader all 变得无法访问 1,和
    4. GC 运行s2,以及
    5. GC 检测到 classes 不可访问2 并卸载4 它们。

简而言之,您很可能没有看到任何卸载日志消息,因为没有 class 正在(正在)卸载。


Side question: deprecated word means discouraged, not no-longer-working, why such behavior?

因为他们决定改变 JVM 日志记录选项的工作方式。更改发生在 Java 9:请参阅 https://openjdk.java.net/jeps/158

-XX 选项可能会发生变化。查看手册以了解您为当前选项使用的 Java 版本。相关发行说明中还应提及更改(功能弃用和删除)。

JVM 选项页面 linked to 以粗体显示:

"Please note that this page only applies to JDK 7 and earlier releases."


1 - 在 class 和它的 classloader 之间有双向 links,和一个单向 link class 到 class 本身的任何实例。一个结果是 bootstrap class 加载程序和应用程序 class 加载程序将在 JVM 的生命周期内保持可访问性。
2 - GC 通常只在必要时 运行;即当堆利用率达到某个阈值时。它不会在 JVM 退出时自动 运行。
3 - 单个 运行 GC 不一定能找到所有无法访问的对象。
4 - 某些 JVM/GC 不支持 class 卸载,可以通过命令行选项禁用(或可能需要启用)此功能。

如果有人正在寻找如何登录class卸载?

添加 JVM 参数 -Xlog:class+load=info