【问题标题】:What does JProfiler "Run GC" button uses to clean garbage compare to regular GC tuning being done by JVM与 JVM 进行的常规 GC 调整相比,JProfiler“运行 GC”按钮用于清理垃圾的作用是什么
【发布时间】:2018-03-01 21:37:03
【问题描述】:

我有一个 Java 企业应用程序,这几天开始消耗更多内存,即使 GC 正在运行并且我们设置了足够的参数 (ConcMarkSweepGC),它也没有释放完整的内存。

当我附加 JProfiler 时,观察到每当 GC 运行时,它只会清除它是否正在消耗 9GB,只有大约 1 到 1.2 GB 被清除。同时,如果我点击 JProfiler 附带的“运行 GC”按钮,它会从占用的 9 GB 中清除至少 6-7 GB。

我试图了解 Jprofiler GC 与应用程序执行的常规 GC 相比有哪些额外功能。

以下是一些所需的详细信息: - 应用服务器:Wildfly 9 - Java 版本:Java 8 - 操作系统:Windows 2012 - 64Bit

对此的任何帮助都会有所帮助。提前致谢。

【问题讨论】:

    标签: java garbage-collection jprofiler


    【解决方案1】:

    不同的 GC 算法之间的行为会有所不同,但原则上,旧空间上的 GC 不应该始终清除所有未使用的内存。在 New Space 中,我们看到了一个复制并行 GC 来对抗内存碎片,但 Old Space 应该要大得多。运行这样的 GC 会导致长时间的停顿。您选择了ConcMarkSweepGC,这是一个并发 GC,如果有足够的空闲内存,它不会尝试执行完全停止世界的 GC 循环。您可能使用 JProfiler 在 Old Space 上启动了一个完全停止世界的 GC。

    如果您想详细了解它,请阅读 JVM 中不同的 GC 算法。它们中有很多,并且在设计时考虑了不同的目标。

    【讨论】:

    • 没错。至于实现,JProfiler 中的“Run GC”按钮只需调用被分析的 JVM 中的System.gc()
    • 是的,我对 GC 算法有一定的了解,我想了解的是 JProfiler 如何能够告诉 GC 执行完全停止世界的 GC,据我所知,我们可以只调用不能保证完整 gc 的 System.gc 或 runtime.gc,每当我们单击 JProfiler 的“运行 Gc”时,它确实会在几秒钟内积极清理内存。我错过了什么吗?
    猜你喜欢
    • 1970-01-01
    • 2010-12-25
    • 1970-01-01
    • 1970-01-01
    • 2021-01-22
    • 1970-01-01
    • 1970-01-01
    • 2012-02-06
    • 1970-01-01
    相关资源
    最近更新 更多