为什么Java使用静态堆而不是允许任意数量的内存?

Tyl*_*den 4 java memory heap jvm vm-implementation

在Java中,虚拟机预先分配了一个无法在运行时扩展的内存堆.当VM加载时,开发人员可以使用-Xmx开关增加堆的大小,但是无法在运行时增加堆的最大大小.为什么是这样?

Ewa*_*ald 8

碎片化是内存分配中的一个大问题,内存饥饿也是如此.如果您可以分配和保留所需的内存,尤其是在服务器环境中,它会更简单,并且更不容易出错.通过预先分配内存,你也有更大的可能性让你的大部分内存连续分配(不保证,谢谢@mttdbrd),访问速度更快.

回到Java刚开始的时候,超过1GB RAM的安装几乎闻所未闻,相反,我们不得不使用只有256mb RAM的机器,有时甚至更少!结合RAM有多慢,并且能够读取和写入希望连续分配的块更有意义.你也不是经常敲打操作系统来为你提供更多内存,然后再释放它,从而释放(当时)宝贵的CPU周期.

在那种环境中,突然间内存很容易耗尽,因此能够分配你可能需要的东西并确保在时机成熟时能够拥有它是很有意义的.

这些天,我觉得RAM更容易访问,它的意义不大,但是,当我查看我的服务器以及如何分配内存时,我喜欢这样一个事实:我的所有Java应用程序都有很好的,大多是连续分配的块与其他一些应用程序进行比较时的内存.

这也是为什么你不能在运行时堆起来的原因,没有办法保证你将不再有连续的分配.


mtt*_*brd 7

根据JVM规范,没有理由为什么必须提前指定堆大小,除非它是实现者的选择.规范声明:"Java虚拟机实现可以为程序员或用户提供对堆的初始大小的控制,以及如果可以动态扩展或收缩堆,则控制最大和最小堆大小."

这里的其他答案是错误的:"堆可能是固定大小的,也可能根据计算需要进行扩展,如果不需要更大的堆,可能会收缩."

来源:Java虚拟机规范,Java SE 7 Edition.第2.5.3节"堆".这是印刷版的第13页.