为什么JVM内存参数通常是256的倍数?

9
我看到几乎所有的JVM内存参数通常都是256的倍数或者是一个“round”二进制值 - 例如256m,512m,1024m等。我知道,这可能与物理内存(RAM)通常是二进制数有关,例如256 MB,1 GB等。
我的问题是,如果将JVM内存设置为256的倍数或任何二进制值,是否真的有助于内存管理?将JVM内存保持为圆整的十进制值,例如1000m而不是1024m,是否会对其造成伤害 - 尽管我从未见过任何使用此类在十进制方面被认为是“round”的值的JVM。
当启动JVM时,操作系统会分配所需的内存,因此我想,这更多地是针对JVM的问题,即它能否有效地管理圆形十进制内存大小(例如1000 MB),或者是否会存在任何缺陷。
编辑:我知道,我们可以使用十进制值来设置JVM内存,但我的问题是,我们应该使用十进制值吗?
编辑2:对于有关JVM是否同样有效地处理每个内存大小的意见/猜测,请分享您用于得出结论的任何相关链接。我已经看到了足够的这个话题的争议,但我还没有看到任何具体的推理来支持十进制或二进制值。

JIT 会使你的变量对齐,所以我认为这并不重要。 - Tuğrul
@Pat,这几乎无关紧要,即使您指定为1MB,它也是2的倍数(考虑字节1024 * 1024)。 - Shailesh Aswal
5个回答

8
不必在JVM内存参数中使用2的倍数。如果旧值不够用,加倍值是内存分配的常见方法。
如果您按1MB递增分配内存值,就需要多次(可能是几百次)调整该值,直到配置符合要求。所以将旧值加倍更加方便。
这取决于那个年代内存是廉价资源的事实。
编辑:
正如您已经提到的,可以分配1000 MB或381 MB等值。 JVM可以处理足以托管permGenSpace,堆栈和堆的任何内存大小。

谢谢。是的,JVM可以处理任何内存大小,但我的问题是,如果我使用一个不是2的倍数的值,它是否会浪费任何内存?这更像是一个最佳实践的问题,我猜。规范或实现中是否有关于JVM如何管理内存的说明(提供一些相关信息的链接将是很好的)? - Pat
由于内存参数只影响JVM分配的最小和最大内存,不影响实际分配的内存。这意味着JVM在min和max之间分配一个值,但它取决于JVM从操作系统中分配多少内存。如果我们查看任务管理器或资源监视器,我们会发现分配的内存总是2 ** KB的倍数。例如1,345,488 KB,即1,313.95 MB。因此,最小分配块大小必须为2或4 KB。 - Chip

3

没关系,四舍五入的值没有特别的处理。

您可以以1字节精度指定内存大小,JVM本身会将大小舍入到它感觉舒适的值。例如,堆大小舍入到2 MB边界。请参见我的其他答案:https://stackoverflow.com/a/24228242/3448419


谢谢您的回答。这意味着,如果您指定的内存不是2的倍数,比如123 MB,那么它会被“舍入”到最近的2 MB边界——在这种情况下是122 MB。本质上,舍入的1 MB 被浪费了,对吗?再次感谢您提供的链接是针对“OpenJDK”的,所以您知道它是否是规范的一部分,还是由实现决定这些细节的? - Pat
2
@Pat 堆大小通常会向上舍入,即 123 -> 124 MB。不过,这取决于具体实现。 - apangin

1

这些值不一定是2的倍数,这只是使用方式之一。你可以使用任何值。

-Xms1303m -Xmx2303m -XX:MaxPermSize=256m // my configs

1
谢谢。我知道,我们可以使用十进制值。但是你有任何内存分析结果或比较结果来证明它是否重要吗? - Pat

1
我认为这主要是一种思维方式,类似于:“我有1GB内存,我会给JVM一半,也就是512 MB。”

0

这只是一种确保您指定的大小(作为参数)适合实际分配的内存的方法,因为机器按2的幂大小的块分配内存。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接