JProfiler -“运行 GC”按钮与堆快照的“在堆快照中执行完整 GC”选项

Posted

技术标签:

【中文标题】JProfiler -“运行 GC”按钮与堆快照的“在堆快照中执行完整 GC”选项【英文标题】:JProfiler - "Run GC" button vs Heap Snapshot's "Perform full GC in heap snapshot" option 【发布时间】:2019-02-15 22:35:22 【问题描述】:

我有创建类加载器实例 (URLClassLoader) 并使用它动态加载 Jar 文件的应用程序。接下来,使用反射创建来自 Jar 的类的实例。最后,所有引用都以 Class Loader 及其相关对象和类应该被垃圾回收的方式无效。

JProfiler 10.1.5 中进行分析期间,我单击“Run GC”工具栏按钮,然后拍摄堆快照(无论是否“Perform full GC in heap快照”选项被选中)。正如我所料,堆上没有 Class Loader 实例,没有相关的对象和类,它们是垃圾收集的。

另一方面,当我不使用“Run GC”按钮,而是使用“Perform full GC in heap snapshot”拍摄许多堆快照时 选项 selected(带有“仅保留强引用持有的对象”子选项),我总是在快照上看到我的 Class Loader 实例,以及相关的对象和类。他们没有被垃圾收集!为什么?

【问题讨论】:

【参考方案1】:

类加载器被 JProfiler 视为 GC 根,堆遍历器不会尝试收集类加载器。

【讨论】:

好的,但是为什么呢?如果没有其他东西引用它及其类和对象,则类加载器有资格被垃圾收集器删除。我认为 Heap Walker 应该让用户有可能收集类加载器,或者至少应该有关于 Heap Walker 的这种行为的清晰可见的信息。我花了很多时间寻找问题出在哪里,结果证明我的代码是正确的,但 Heap Walker 给出了误导性信息。 当然,heap walker 不会尝试收集类加载器,因为它不会收集任何东西。您的答案是把堆转储分析工具与 JVM 的实际垃圾收集器混淆了。 @Holger 应该把“collect”放在引号里,但过程类似

以上是关于JProfiler -“运行 GC”按钮与堆快照的“在堆快照中执行完整 GC”选项的主要内容,如果未能解决你的问题,请参考以下文章

Linux安装JProfiler监控tomcat

jprofiler安装和配置

[转帖]Jprofiler远程连接linux项目监控

在 iSeries / AS400 上运行 jprofiler 时出现问题

如何使用 jprofiler 分析 gwt 客户端应用程序?

JAVA性能调试+JProfiler使用相关