java - JVM ClassUnloadingWithConcurrentMark 标志

标签 java garbage-collection jvm g1gc

我有一个关于 ClassUnloadingWithConcurrentMark 标志的问题,因为我在任何地方都没有找到任何有用的帮助。如果我们使用G1GC则默认设置为true(-XX:+ClassUnloadingWithConcurrentMark)。如果我使用 -XX:-ClassUnloadingWithConcurrentMark 标志在 G1 并发标记之后关闭类卸载,那么类卸载在哪里执行(哪个阶段)?我在某处读到,当完全GC被激活时会发生这种情况,如果完全GC从未被触发怎么办?我在备注阶段遇到问题 - 下面示例中的卸载花费了超过 3 秒的时间:

2015-06-08T08:09:16.318+0200: 572818.729: [GC remark 572818.729: [Finalize Marking, 0.0002590 secs] 572818.729: [GC ref-proc, 0.4479462 secs] 572819.177: [Unloading, 3.2004912 secs], 3.6499382 secs]
 [Times: user=0.20 sys=0.08, real=3.64 secs] 

使用 -XX:-ClassUnloadingWithConcurrentMark 对我减少类卸载时间有用吗?如果我使用此选项,如果类卸载永远不会发生,我担心我会遇到更多问题(例如内存不足异常,...)。

编辑:如果我们使用 -XX:+ClassUnloadingWithConcurrentMark (默认选项),每次 GC 重新标记阶段发生时都会触发类卸载吗?在日志中,我有一些GC,其GC原因:元数据GC阈值,但其他人没有此原因,但卸载仍然发生在备注阶段。为什么会这样?

最佳答案

I'm afraid that If I'll use this option I'll have even more problems

为什么不为这些事情设置一个测试环境并自己测试呢?

无论如何,正如已经回答的那样 over here ,VM 将执行一些最后的英雄行为(1-2 次完整 GC,完整的软引用清除),以确保在抛出 OOM 之前情况不可恢复。

Would using -XX:-ClassUnloadingWithConcurrentMark be useful to me to reduce class unloading times?

它是否会减少它们,我不知道,可能不会。这就是你必须自己尝试的事情。但这可能会延迟很长一段时间。

if we are using -XX:+ClassUnloadingWithConcurrentMark (default option) is class unloading triggered every time GC remark phase occurs?

是的,这是用 JDK-8049421 添加的以及使用 JDK-8051607 再次将其关闭的标志.

您所要做的就是在 openjdk bugtracker 和/或 hotspot-gc-dev 邮件列表上搜索“类卸载”。这些都是公开信息。


您可以尝试的另一件事是设置-XX:MinMetaspaceFreeRatio=20 -XX:MaxMetaspaceFreeRatio=30。这将更快触发类卸载,并有望缩短周期。

关于java - JVM ClassUnloadingWithConcurrentMark 标志,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30707750/

相关文章:

java - 在 Java 中上传文件时重置 InputStream

java - 如果我们可以使用代码库,小程序中的主机参数是什么?

c# - 控制 Mono GC

java - 从 JVM 堆中消除密码

java - 如何用 Java 编写正确的微基准测试?

java - 在 Eclipse 中查找具有给定参数类型的方法引用

java - Android 在同一页面上滚动到 ID

C# - 清理事件处理程序

Python - 打印出对特定实例的所有引用

java - 使用 Krakatau 将 Java 字节码重新组装到 .class 文件时出错