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”选项的主要内容,如果未能解决你的问题,请参考以下文章
在 iSeries / AS400 上运行 jprofiler 时出现问题