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

Java CMS GC行为

严柏
2023-03-14
问题内容

我有一个导致创建大量垃圾的应用程序。第一个(也是几乎一个)标准是GC暂停时间短。我使用visualgc工具(和gc日志)尝试了不同的GC参数。最佳参数如下。

-XX:+ UseConcMarkSweepGC

-Xmx1172M

-Xms600M

-XX:+ UseParNewGC

-XX:NewSize = 150M

我的应用程序在带有Java 1.6.0_21的SunOS 10上运行。硬件为2 x CPU四核(uname -X结果为numCPU = 8)。

问题是

观察GC行为,在eden空间上创建新对象,直到eden满为止。当eden space满GC运行时,清除垃圾,如果对象没有死拷贝到Old-gen(我丢弃“ from”和“ to”空间),类似Old-Gen已满,GC在CMS并发阶段运行并清除Old -gen空间。CMS的某些部分是“世界停止”(暂停时间)。这是一个循环

  1. 以上场景是真的吗?
  2. GC清除旧空间后,没有足够的空间扩展旧空间(XMS和XMS值不同)?
  3. 何时启动完全GC操作?如何决定呢?
  4. CMS并发阶段持续时间取决于Eden空间大小,实际上我的期望是,Eden空间不会影响CMS并发阶段持续时间。CMS并发阶段中与伊甸园空间有关的GC发生了什么?
  5. 还有什么建议对我最大程度地减少了暂停时间?确实,对我来说最有价值的答案:)
    谢谢

问题答案:

使用CMS时,您不能仅仅忽略幸存者空间。CMS不是紧凑的收集器,这意味着如果您(或JVM)错误地确定了使用期限阈值,则您将缓慢地将对象放空到使用期限,这将增加使用期限片段的比率,这将延长强制执行CMS的时间,因为没有足够的连续可用空间来处理从幸存者空间升为保有权的提升,这将强制执行完整的gc周期而没有提前警告,因此这是1 STW暂停中的全部。这需要多长时间取决于堆的大小,但很可能会发生一件事,它将比正常的eden集合长几个数量级。

这里还有其他一些注意事项;

  1. STW暂停不仅来自CMS,而且也来自年轻的一代收藏家
  2. CMS有2个STW阶段(标记,备注)和3-4并发阶段,第一阶段STW(标记)严格单线程这可能会导致问题(样品讨论这个在这里)
  3. 您可以控制处理并发阶段的线程数
  4. 您需要了解物体可以生存多长时间,这可能意味着要使用它,-XX:+PrintTenuringDistribution或者可以像完成操作一样使用visualgc观看它
  5. 然后,您可以对其进行调整,-XX:SurvivorRatio以控制相对于伊甸园的幸存者空间的大小,并-XX:MaxTenuringThreshold控制对象在使用年限之前可以幸存的频率
  6. -XX:CMSInitiatingOccupancyFraction 可以用来指导CMS在开始CMS阶段之前需要达到多满(输入错误,将会严重停顿)
    最终,您需要了解哪个收集器正在暂停,暂停多长时间,暂停多长时间以及是否有任何异常原因导致暂停。然后,您需要将此值与每一代的大小进行比较,以查看是否可以调整参数,以最大程度地减少暂停次数(和/或持续时间)。

请记住,由于需要长时间运行的测试以查看其是否随着时间的推移而恶化,因此这可能会浪费时间。而且,由于没有可重复的自动化工作负载,因此几乎不可能就您是否确实在改进方面得出任何肯定的结论。



 类似资料:
  • 问题内容: 说我有身份证。我将如何获得下一行或上一行? 问题答案: 这就是我用来查找上一个/下一个记录的方法。表格中的任何列都可以用作排序列,并且不需要联接或讨厌的技巧: 下一条记录(日期大于当前记录): 上一个记录(日期小于当前记录): 例:

  • 问题内容: 下面的小提琴有三个方块。 块1 包含三列。中间的列中有两行,每行设置为flex:1。 块2 包含三列。中间的列中有两行,每行设置为flex:1。第二行包含一条狗的图像。图像将不会缩小到包含图像的行的高度。 块3 仅包含中间的列,中间有两行,每行设置为flex:1。第二行包含一条狗的图像。图像确实缩小到包含图像的行的高度。 问题是,为什么块2中间列的第二行中的图像不缩小到包含该行的行的高

  • 我已经简化了下面的代码在更新的表视图。 由于某些原因,我没有像人们所期望的那样使用JavaFx的属性,也许这种行为与此有关。来自JTable和observer模式,我想尝试如何在javafx中实现这一点。然而,我的表格数据都很好,但当我试图改变背景颜色时,更多的行出现在表格范围之外。我已经检查了可观察列表的大小,结果与预期一致。 我无法真正看到或理解datas.set是如何产生这种行为的,这是我在

  • 行为是 yii\base\Behavior 或其子类的实例。 行为,也称为 mixins, 可以无须改变类继承关系即可增强一个已有的 组件 类功能。 当行为附加到组件后,它将“注入”它的方法和属性到组件, 然后可以像访问组件内定义的方法和属性一样访问它们。 此外,行为通过组件能响应被触发的事件,从而自定义或调整组件正常执行的代码。 定义行为 要定义行为,通过继承 yii\base\Behavior

  • 问题内容: 我正在尝试不同的JOIN查询,但没有得到想要的结果。 我有2张桌子: 我找不到想要的结果。 我想得到以下结果: 问题答案: 您不能具有这样的动态列数,但是可以 将数据连接 成字符串: 或者您可以使用或手动 旋转行( 我更喜欢后一种方法,对我来说似乎更灵活,但是在某些情况下可以大大减少代码量): 您还可以将前面的语句转换为 动态SQL, 如下所示:

  • 问题内容: 我有一个问题,如果我有一排像这样 我如何将其分成三行,如下所示: / J 问题答案: 您可以使用递归CTE: SQLFiddleDEMO 编辑: 基于Marek Grzenkowicz的回答和MatBailie的评论,全新的想法: 生成从1到max(qty)的数字,并在其上加入表。 SQLFiddle演示

  • 问题内容: 我想选择数据库中的所有行,但希望它们以倒序排列。意思是,我想将第一列数据用作新实体,将当前实体用作第一列。我想你明白我的意思 这是一个例子 至 问题答案: 使用固定的已知列,这里是做这的方法(我将表命名为“ grades”是自由的): 大概的概念: 创建并执行不同查询的并集。 由于您需要实际数据作为列标题,因此联合的第一部分如下所示: 仅该查询将复制结果,因此我们需要通过添加告诉MyS

  • 问题内容: 我遇到了一个非常奇怪的问题。我需要在Jenkins中配置代理,以便 能够访问其中一项作业的SVN存储库。我这样做有两种方式: 从命令行使用必需的参数启动Jenkins 在jenkins.xml文件中定义参数时,将Jenkins作为Windows服务启动。 Starting from command line : -Dhudson.model.DirectoryBrowserSuppor