【发布时间】:2014-07-05 06:09:24
【问题描述】:
添加时
-Xmx????m
对于命令行,JVM 为您提供了一个接近此值但最多可超出 14% 的堆。 JVM 可以为您提供更接近您想要的数字,但只能通过反复试验。
System.out.println(Runtime.getRuntime().maxMemory());
打印
-Xmx1000m -> 932184064
-Xmx1024m -Xmx1g -> 954728448
-Xmx1072m -> 999292928
-Xmx1073m -> 1001390080
我正在运行 HotSpot Java 8 更新 5。
很明显,堆可以在1000000000之上,但为什么是-Xmx1073m而不是-Xmx1000m?
顺便说一句 1g == 1024m 这表明 1g 应该是 1024^3,比 1000^3 高 7%,但你得到的结果比 1000^3 低 7%。
如此之多表明我错过了关于堆如何工作的一些基本知识。如果我要求 -Xmx1000m 并且它是 1001390080 我不在乎,我会假设它需要遵守一些分配倍数,但是给你 932184064 向我表明堆比我能做的更复杂想象一下。
编辑我发现
-Xmx1152m gives 1073741824 which is exactly 1024^3
所以看起来它给我的内存比我在这种情况下所要求的少了 128 MB,参见 maxMemory()。
顺便说一句,128 是我最喜欢的数字。我今天在街道号128 参加了一个会议,演讲者引用了128 页上的一本书;)
【问题讨论】:
-
你为什么在乎它是
1000000000? -
@Absurd-Mind 这只是多年来困扰我的那些令人印象深刻的事情之一。它在不同的 JVM 中也有所不同,因此您无法确定在系统之间真正会得到什么。
-
@Absurd-Mind 不一定要精确,但必须相差这么多吗?这表明我缺少关于堆如何工作的一些基本知识。
-
1000 MB RAM 是 1,048,576,000 (1000 * 2**20) 字节。如果有的话,你在第一个数字上的空头 11%。
-
@Alex 是的,我在同一台机器上得到相同的数字。顺便说一句
-Xmx1g==-Xmx1024m这让它变得更加陌生。
标签: java memory garbage-collection jvm heap-memory