为什么未成年GC持续时间的变化这么大,当大数组的元素被更新?

克斯特亚:

我有以下简单的程序:

public class GCArrays {
    public static void main(String[] args) {
        Object[] bigArr = new Object[1 << 24];
        Object[] smallArr = new Object[1 << 12]; 

        bigArr[0x897] = new Object();
        smallArr[0x897] = new Object();

        for (int i = 0; i < 1e10; i++) {
            smallArr[0x897] = new Object();  // (*)
            //bigArr[0x897] = new Object();
        }

        // to prevent bigArr and smallArr from being garbage collected
        bigArr[0x897] = new Object();
        smallArr[0x897] = new Object();
    }
}

当我使用ParallelGC作为GC算法的年轻一代运行它:

java -classpath . -XX:InitialHeapSize=4G -XX:MaxHeapSize=4G -XX:NewRatio=3 -XX:+PrintGC -XX:+PrintGCDetails -XX:+UseParallelGC -XX:+UseParallelOldGC GCArrays

平均暂停时间,我得到低于1ms的:

[GC (Allocation Failure) [PSYoungGen: 1047584K->32K(1048064K)] 1113476K->65924K(4193792K), 0.0007385 secs] [Times: user=0.00 sys=0.00, real=0.00 secs]

但是,如果我改变打上行(*)修改bigArr,而不是smallArr暂停时间增加为10ms:

[GC (Allocation Failure) [PSYoungGen: 1047584K->32K(1048064K)] 1113468K->65916K(4193792K), 0.0101251 secs] [Times: user=0.00 sys=0.00, real=0.01 secs]

请注意,该程序仅修改所述阵列的单个元件。但是它看起来像JVM仍然扫描整个阵列小的收集过程中发现活的对象。是我的猜想解释不再GC暂停正确吗?为什么整个阵列需要当只有一个元件在这种情况下被修改以被扫描?

阿列克谢Ragozin:

本文介绍的脏卡片概念以及它们在年轻的GC作用。

在这两种情况下,烧毛旧存储空间的地址为“弄脏”,因此单卡。对于参考阵列对象跨越多个卡(512字节块)只为真改性索引子范围卡被修改。

由于只有单个卡“dirtified”,GC仅需要扫描对应512个字节的存储器。

有了-XX:+UseConcMarkSweepGC这两个“smallArr”和“bigArr”版本都出现了类似的时机。

-XX:+UseConcMarkSweepGC + smallArr

[GC (Allocation Failure) [ParNew: 419458K->2K(471872K), 0.0015320 secs] 485365K->65909K(996160K), 0.0015635 secs] 
[Times: user=0.00 sys=0.00, real=0.00 secs]

-XX:+UseConcMarkSweepGC + bigArr

[GC (Allocation Failure) [ParNew: 419458K->2K(471872K), 0.0020550 secs] 485365K->65909K(996160K), 0.0020885 secs] 
[Times: user=0.00 sys=0.00, real=0.00 secs]

虽然这-XX:+UseParallelOldGC,似乎GC能够扫描整个“bigArr”

-XX:+ParallelOldGC + smallArr

[GC (Allocation Failure) [PSYoungGen: 522768K->16K(523520K)] 588691K->65939K(1047808K), 0.0009430 secs] 
[Times: user=0.00 sys=0.00, real=0.00 secs]

-XX:+ParallelOldGC + bigArr

[GC (Allocation Failure) [PSYoungGen: 522768K->16K(523008K)] 588687K->65935K(1047296K), 0.0149276 secs] 
[Times: user=0.03 sys=0.00, real=0.02 secs]

-XX:+ParallelOldGC + bigArr = new Object[1 << 25]

[GC (Allocation Failure) [PSYoungGen: 522768K->16K(523520K)] 654219K->131467K(1047808K), 0.0413473 secs]
[Times: user=0.09 sys=0.00, real=0.04 secs] 

反直觉ParallelOldGCConcMarkSweepGC使用非常相似的年轻GC算法的不同实现。

它看起来像PSYoungGen缺少优化,只扫描对象数组的脏部分。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

OpenMP-随机运行时间-为什么运行时变化这么大?

来自分类Dev

将持续时间分成年度部分

来自分类Dev

如何更改未成年人的数量?

来自分类Dev

当数组具有重复值时,为什么快速排序算法的持续时间会增加?

来自分类Dev

持续时间变化的 CSS Steps()

来自分类Dev

为什么CSS动画没有持续时间?

来自分类Dev

为什么记录持续时间而不查询?

来自分类Dev

为什么Application_ResolveRequestCache的持续时间很长?

来自分类Dev

为什么链元素之间的间距这么大?

来自分类Dev

用Javascript更新动画持续时间

来自分类Dev

iBeacon约束可以接受多个专业/未成年人

来自分类Dev

我怎么知道Linux模块初始化的未成年人

来自分类Dev

chol.default(Cxx)中的错误:顺序的前导未成年人不是肯定的

来自分类Dev

SQL-未成年人之前存在主要帐户

来自分类Dev

如何生成持续时间数组

来自分类Dev

为什么visualvm中的“总时间”列与运行时持续时间不同?

来自分类Dev

为什么从后台线程更新UI需要这么长时间?

来自分类Dev

为什么更新包需要这么长时间?

来自分类Dev

为什么Windows 7更新需要这么长时间安装?

来自分类Dev

为什么乳胶这么大?

来自分类Dev

为什么BigQuery无法识别文本格式的持续时间的正确顺序

来自分类Dev

为什么std :: future :: wait_for不等待正确的持续时间?

来自分类Dev

为什么需要将变量转换为持续时间而不是原始整数?

来自分类Java

为什么在java.time中无法获得以分钟或小时为单位的持续时间?

来自分类Dev

为什么此SKAction moveByX:y:持续时间:根本不移动此精灵?

来自分类Dev

为什么当我为CABasicAnimation设置较低的持续时间值时,它会跳吗?

来自分类Dev

Debug.DrawLine:为什么持续时间过后,行没有消失?

来自分类Dev

为什么Google Analytics(分析)AVG会话持续时间错误?

来自分类Dev

为什么在Glimpse SQL选项卡上有2个持续时间?

Related 相关文章

  1. 1

    OpenMP-随机运行时间-为什么运行时变化这么大?

  2. 2

    将持续时间分成年度部分

  3. 3

    如何更改未成年人的数量?

  4. 4

    当数组具有重复值时,为什么快速排序算法的持续时间会增加?

  5. 5

    持续时间变化的 CSS Steps()

  6. 6

    为什么CSS动画没有持续时间?

  7. 7

    为什么记录持续时间而不查询?

  8. 8

    为什么Application_ResolveRequestCache的持续时间很长?

  9. 9

    为什么链元素之间的间距这么大?

  10. 10

    用Javascript更新动画持续时间

  11. 11

    iBeacon约束可以接受多个专业/未成年人

  12. 12

    我怎么知道Linux模块初始化的未成年人

  13. 13

    chol.default(Cxx)中的错误:顺序的前导未成年人不是肯定的

  14. 14

    SQL-未成年人之前存在主要帐户

  15. 15

    如何生成持续时间数组

  16. 16

    为什么visualvm中的“总时间”列与运行时持续时间不同?

  17. 17

    为什么从后台线程更新UI需要这么长时间?

  18. 18

    为什么更新包需要这么长时间?

  19. 19

    为什么Windows 7更新需要这么长时间安装?

  20. 20

    为什么乳胶这么大?

  21. 21

    为什么BigQuery无法识别文本格式的持续时间的正确顺序

  22. 22

    为什么std :: future :: wait_for不等待正确的持续时间?

  23. 23

    为什么需要将变量转换为持续时间而不是原始整数?

  24. 24

    为什么在java.time中无法获得以分钟或小时为单位的持续时间?

  25. 25

    为什么此SKAction moveByX:y:持续时间:根本不移动此精灵?

  26. 26

    为什么当我为CABasicAnimation设置较低的持续时间值时,它会跳吗?

  27. 27

    Debug.DrawLine:为什么持续时间过后,行没有消失?

  28. 28

    为什么Google Analytics(分析)AVG会话持续时间错误?

  29. 29

    为什么在Glimpse SQL选项卡上有2个持续时间?

热门标签

归档