为什么Java堆的最大大小是固定的?

is not possible增加虚拟机启动后Java堆的最大大小。这是什么技术原因?垃圾收集算法是否依赖于具有固定数量的内存来使用?还是出于安全原因,通过消耗所有可用内存来防止Java应用程序对系统上的其他应用程序执行DOS操作?
在Sun的JVM中,最后我知道,整个堆必须在连续的地址空间中分配。我想象对于大的堆值,很难添加到您的地址空间启动后,同时确保它保持连续。你可能需要在启动时得到它,或者根本不需要。因此,它是固定的。

即使不是立即使用,在启动时保留整个堆的地址空间。如果它不能为您传递的-Xmx的值预留足够大的连续块地址空间,那么它将无法启动。这就是为什么在32位Windows上分配> 1.4GB堆很困难,因为很难找到大小或更大的连续地址空间,因为有些DLL喜欢在某些地方加载,分割地址空间。这不是真正的问题,当你去64位,因为有这么多的地址空间。

这几乎肯定是出于性能原因。我找不到一个伟大的链接详细说明这一点,但这里是一个很好的报价从彼得·凯斯勒(full link – 一定要阅读评论),我发现在搜索。我相信他在Sun的JVM上工作。

The reason we need a contiguous memory
region for the heap is that we have a
bunch of side data structures that are
indexed by (scaled) offsets from the
start of the heap. For example, we
track object reference updates with a
“card mark array” that has one byte
for each 512 bytes of heap. When we
store a reference in the heap we have
to mark the corresponding byte in the
card mark array. We right shift the
destination address of the store and
use that to index the card mark array.
Fun addressing arithmetic games you
can’t do in Java that you get to (have
to 🙂 play in C++.

这是在2004年 – 我不知道自那时以来有什么变化,但我很确定它仍然持有。如果您使用类似Process Explorer的工具,您可以看到Java应用程序的虚拟大小(添加虚拟大小和专用大小内存列)包括启动时的总堆大小(加上其他所需的空间,毫无疑问) ,即使内存’used’由进程将没有附近,直到堆开始填满…

http://stackoverflow.com/questions/2109676/why-is-the-maximum-size-of-the-java-heap-fixed

本站文章除注明转载外,均为本站原创或编译
转载请明显位置注明出处:为什么Java堆的最大大小是固定的?