gpt4 book ai didi

java - 堆大小大于 -Xmx

转载 作者:行者123 更新时间:2023-11-30 06:15:41 24 4
gpt4 key购买 nike

我使用 -Xms256m and -Xmx256m JVM options 将初始和最大 Java 堆大小设置为 256MB . GC 日志(使用 -XX:+PrintHeapAtGC)表明堆大小为 251904K (246MB),即 smaller than the minimum heap size, -Xms256m (见日志的最后一行)。然而,这是因为 the stated heap size is the available heap size , 其中不包括 the unavailable from space .

当我手动包含不可用的 from space 内存时,派生堆大小为 262656K (256.5MB),略大于最大堆大小, -Xmx(减 512KB):

[heap size] = [eden space size] + [from space size] + [to space size] + [OldGen size]
262656K = 66048K + 10752K + 10752K + 175104K

为什么堆大小略大于最大堆大小,-Xmx

最佳答案

起初看起来很奇怪,但像往常一样没有魔法。找出答案的唯一方法是更深入:到 openjdk sources .只需 checkout 并尝试 grep:grep -r "Xmx".

会有很多测试,但它们对我们来说并不有趣。两个文件可以帮助我们:/vm/runtime/arguments.cpp 和/vm/memory/collectorPolicy.cpp

我们看一下arguments.cpp:只有简单的参数解析,例如对于 -Xmx256M 它将类似于 result = 256 * 1024 * 1024 (我做了一些内联)。所以我们的问题没有答案。

但是这里初始化了变量MaxHeapSize,所以我们可以尝试找到它。 MaxHeapSize的真正用法可以在我们的/vm/memory/collectorPolicy.cpp中找到(其中Xmx仅在注释中使用),其中选择了所有堆生成大小根据某些政策。

如果我们跳过所有细节,我们会发现堆中的所有区域都应该对齐,并且区域的大小取决于比率参数。

生成比率的默认 JVM 参数是 -XX:NewRatio=2(年轻一代与老一代大小的比率)和 -XX:SurvivorRatio=8(年轻一代与老一代大小的比率)伊甸园:幸存者一族)。但是堆大小并不总是可以被 3、9 或其他东西整除,所以应该进行一些舍入。而且,正如我之前提到的,始终应该保持一致。

那么,终于有了答案:这些大小是唯一可能满足代数比和对齐条件的大小。这些值的总和并不总是可能等于 Xmx 参数值。

如果你对细节感兴趣,你可以找到四舍五入的逻辑-XX:NewRatio here在方法 scale_by_NewRatio_aligned 中。尝试自己找到关于 -XX:SurvivorRatio 的相同逻辑 :)

关于java - 堆大小大于 -Xmx,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28390243/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com