基本上我们注意到,在某些计算机上,设置JVM选项-Xmx(最大堆大小)有时会导致JVM无法初始化,即使系统上的RAM很充足。
例如,在一台4gb的计算机上,我们有-Xmx1024m会失败,但是-Xmx800m可以正常工作。我可以理解在1gb甚至2gb的计算机上,但是在4gb的计算机上,尤其是考虑到Windows、Linux等操作系统可以将RAM交换出去,为什么会失败呢?
我看到了很多线程和问题,都建议减少最大堆大小,但没有人能够解释为什么会失败,这才是我真正想要知道的。
另外,如何表达“尽可能地消耗内存,但不超过某个大小”?
例如,在一台4gb的计算机上,我们有-Xmx1024m会失败,但是-Xmx800m可以正常工作。我可以理解在1gb甚至2gb的计算机上,但是在4gb的计算机上,尤其是考虑到Windows、Linux等操作系统可以将RAM交换出去,为什么会失败呢?
我看到了很多线程和问题,都建议减少最大堆大小,但没有人能够解释为什么会失败,这才是我真正想要知道的。
另外,如何表达“尽可能地消耗内存,但不超过某个大小”?
-Xmx
设置的是最大堆大小,这只是虚拟地址空间保留范围的大小;只有在-Xms
中指定的量实际上由已提交的存储支持。例如,请参阅VirtualAlloc
,并比较MEM_RESERVE
和MEM_COMMIT
标志。 - Jeffrey Hantin-Xmx
值),但只有在需要时才将实际的RAM和/或交换页面映射到该地址空间中(从-Xms
值开始)。这是一种优化导致的实现限制 - 它允许垃圾收集器将整个Java堆视为单个巨大的数组。 - Jeffrey Hantin