【问题标题】:java vm: how to log class unloadingjava vm:如何记录类卸载
【发布时间】:2019-10-25 08:14:15
【问题描述】:

我无法在 SO 上找到此处,也无法通过 Web 搜索工作方式来使用 Java VM (JVM) 的参数来记录类卸载。

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

Java HotSpot VM Options:

-XX:-TraceClassUnloading 跟踪类的卸载。 -XX:-TraceClassLoading 跟踪类的加载。

java -XX:-TraceClassUnloading -version 输出没有关于类的信息:

[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)

同样的事情。

附带问题:不推荐使用的词意味着气馁,而不是不再工作,为什么会有这种行为?

但是对于类加载 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 只是版本信息。

如何获取 Java VM HotSpot(和/或 OpenJDK)的类卸载日志?

【问题讨论】:

  • 基本上,您正在查看旧文档。 JVM 命令行选项会定期更改。检查您正在使用的 Java 版本的文档。

标签: java jvm monitoring jvm-hotspot


【解决方案1】:

你这么说

java -XX:-TraceClassUnloading -version 

不输出关于类的信息。但我不知道为什么期望它会提供信息。

只有在 JVM 启动并且类被加载和卸载时,您才会看到日志记录:

  • -version 选项的文档说:

    -version 显示版本信息然后退出。

    它并没有说 JVM 已启动。

    删除-version/

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

  • 假设 JVM 已启动,并且类已加载,但在普通 Java 应用程序中不会卸载类。只有在以下情况下才会发生类卸载:

    1. 创建了一个额外的类加载器,并且
    2. 该类加载器用于加载类,并且
    3. 那些类和类加载器全部变得无法访问1,并且
    4. GC 运行2,并且
    5. GC 检测到类不可访问2 并卸载4 它们。

简而言之,您(曾经)很可能没​​有看到任何卸载日志消息,因为没有(曾经)卸载任何类。


附带问题:deprecated 这个词的意思是气馁,而不是不再工作,为什么会有这种行为?

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

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

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

“请注意,此页面仅适用于 JDK 7 及更早版本。”


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

【讨论】:

  • 谢谢。正如我在问题类加载日志中所写的那样,我认为最后也应该有一些类卸载,但你澄清它并不总是如此。请说明用 AND 或 OR 连接的 1-4 个 if。
  • 我用-Xlog:class+unload 运行我的应用程序,我看到class,unload 行。
【解决方案2】:

如果有人在寻找如何记录类卸载?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 2010-09-14
    • 1970-01-01
    • 2019-01-02
    • 2019-03-15
    • 1970-01-01
    相关资源
    最近更新 更多