当前位置: 首页 > 面试题库 >

CMS垃圾收集器-什么时候运行?

戚衡
2023-03-14
问题内容

我对可以控制CMS收集器启动时间的两个参数感到困惑:

MaxHeapFreeRatio (默认为70%)

CMSInitiatingOccupancyFraction (默认情况下超过90%)

这些参数的确切含义是什么?收集器什么时候开始(标记阶段)并收集(清扫阶段)?


问题答案:

CMSInitiatingOccupancyFraction决定何时启动CMS(为了使此选项生效,您还必须设置-XX:+UseCMSInitiatingOccupancyOnly)。MaxHeapFreeRatio是确定世代空间大小的选项。

参见例如…

http://java.sun.com/docs/hotspot/gc1.4.2/faq.html

通常无法加快并发收集,但可以更早启动。当旧一代中已分配空间的百分比超过阈值时,并发收集开始运行。此阈值是根据并发收集器的一般经验计算得出的。如果正在进行完整收集,则可能需要更早启动并发收集。命令行标志CMSInitiatingOccupancyFraction可用于设置启动收集的级别。其默认值为大约68%。调整值的命令行是
-XX:CMSInitiatingOccupancyFraction=<percent>

http://www.oracle.com/technetwork/java/gc-
tuning-5-138395.html

默认情况下,虚拟机会在每个集合上增加或缩小堆,以尝试将每个集合中活动对象的可用空间比例保持在特定范围内。此目标范围由参数-XX:MinHeapFreeRatio=<minimum>和设置为百分比-XX:MaxHeapFreeRatio=<maximum>,总大小由限制为下限-Xms,之上为-Xmx

.. 要么 ..

http://www.petefreitag.com/articles/gctuning/

-XX:MaxHeapFreeRatio-当一代中的可用空间百分比超过该值时,一代将缩小以满足该值。默认值为70

编辑:我用一个测试程序运行了一些模拟,该程序只是随机创建字节数组的映射并将其复制到周围。我注意到a)分数值未得到尊重-
特别是采用保守值(例如50),CMS初始标记阶段的占用率远远超过50%,通常约为70-80%;
b)分数值较小仍使CMS初始阶段发生得较早(使用的程序-Xmx1536m -Xmx1536m -XX:NewSize=512m -XX:+UseConcMarkSweepGc+ gc日志记录和两个测试参数)

我还发现了与此有关的旧错误报告:http
:
//bugs.sun.com/bugdatabase/view_bug.do?bug_id=6486089



 类似资料:
  • 问题内容: 是什么决定了垃圾收集器何时真正收集?它是在一定时间之后还是在一定数量的内存用完之后发生的吗?还是还有其他因素? 问题答案: 它在确定是时候运行时运行。在世代垃圾收集器中,一种常见的策略是在第0代内存分配失败时运行收集器。也就是说,每次你分配一小块内存(大块通常直接放置在“旧”代中)时,系统都会检查gen-0堆中是否有足够的可用空间,如果没有,则运行GC释放空间以使分配成功。然后将旧数据

  • 问题内容: 据我所知,GC仅在JVM需要更多内存时才使用,但我不确定。所以,请有人提出这个问题的答案。 问题答案: 据我了解,Java的垃圾收集算法非常复杂,而且不那么直接。另外,GC可用的算法还不止这些,可以在VM启动时通过传递给JVM的参数进行选择。 这里有一个有关垃圾收集的常见问题解答:http : //www.oracle.com/technetwork/java/faq-140837.h

  • 1.CMS介绍 CMS(Concurrent Mark-Sweep)(并发 标记-清除)是以牺牲吞吐量为代价来获得最短回收停顿时间的垃圾回收器。对于要求服务器响应速度的应用上,这种垃圾回收器非常适合。在启动JVM参数加上-XX:+UseConcMarkSweepGC ,这个参数表示对于老年代的回收采用CMS。CMS采用的基础算法是:标记—清除。 是标记清除算法的落地实现的垃圾回收器。 2.CMS过

  • 我在java应用程序中使用cms gc。当我在gc日志中看到下面一行时,我感到很困惑 null 谢谢(如有语法错误,请原谅)

  • 问题内容: 在这个主题中,我问了一个有关Java垃圾收集的问题。但是我得到的答案又给了我一个问题。 有人提到垃圾回收器也可以收集类。这是真的? 如果是真的,这是如何工作的? 问题答案: 没有任何引用时,可以对Java中的类进行垃圾回收。在大多数简单的设置中,这永远不会发生,但是在某些情况下可能会发生。 有很多方法可以使类可达,从而阻止其符合GC的资格: 该类对象仍然可以访问。 表示类的对象仍然可以

  • 在Java中,当一个对象没有实时引用时,它就有资格进行垃圾回收。对于字符串,情况并非如此,因为字符串将进入字符串池,而JVM将保持对象活动以供重用。这意味着字符串一旦创建就永远不会被垃圾收集?