【问题标题】:JVM heap space allocation is confusingJVM堆空间分配令人困惑
【发布时间】:2015-02-18 06:20:13
【问题描述】:

我有一个java 应用程序运行,最大堆大小为 8 GB。

在 32 GB 内存上,旧一代的切片为 7.4 GB(大约)。在 128 GB 内存中,相同的应用程序获得 6.2 GB(大约)的 Old Gen 切片。

我想知道JVM 在内部是如何做到的?有没有它使用的数学。实际上,我正处于GC 调整阶段,如果我知道这个数字是如何默认到达的,将会很有帮助。我使用JDK 1.7。

【问题讨论】:

    标签: java jvm


    【解决方案1】:

    它与系统中的总 RAM 无关。 GC 比率会影响各个区域中可以存在的内存量。

    -XX:NewRatio=n 旧/新代大小的比率。默认值为 2。

    -XX:SurvivorRatio=n 伊甸园/幸存者空间大小的比率。默认值为 8。

    -XX:MaxHeapFreeRatio=70 GC 后最大可用堆百分比以避免收缩。

    使用前 2 个比率在 VM 内部调整堆的比率。使用空闲堆比率来调整堆可以增长/缩小的内存量。

    推荐阅读——Oracle提供GC tuning guide。

    【讨论】:

    • 但事实上,我没有设置任何 JVM 调优指标。我的问题是,默认情况下,内存正在分配。对于具有相同最大堆设置的同一应用程序,两台不同的机器有何不同?
    • 不同的负载很可能会导致两台机器的内存配置文件不同。除非您进行负载测试以在 2 台具有相同 JVM 和调整参数的机器之间提供一致的负载,否则您的比较不成立。
    • 谢谢巴拉。我在找那个。负载实际上为零,因为两者都是专用机器。因此,内存配置文件确实决定了 JVM 堆的各个部分。我要这样吗?
    • 如果负载为零,为什么幸存者空间会有很多对象?调整比率/获取一致执行的负载测试/根据测试比较各个区域使用的内存。这就是解决问题的方法。是的,比率决定了堆的哪些部分占用更多内存。
    • 我发布的结果都是预先分配的数字。我提到的数字是从 8 GB 堆中分配的旧代空间量。猜猜,你把它误认为是空间使用了
    猜你喜欢
    • 2022-01-21
    • 2022-01-17
    • 2010-12-23
    • 1970-01-01
    • 1970-01-01
    • 2018-02-26
    • 2012-05-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多