在Java虚拟机启动后增加堆的最大大小是不可能的。这是出于什么技术原因呢?垃圾回收算法是否依赖于固定数量的内存来工作?还是为了安全原因,防止Java应用程序通过消耗所有可用内存来DOS其他系统上的应用程序?
在Java虚拟机启动后增加堆的最大大小是不可能的。这是出于什么技术原因呢?垃圾回收算法是否依赖于固定数量的内存来工作?还是为了安全原因,防止Java应用程序通过消耗所有可用内存来DOS其他系统上的应用程序?
历史上有一个原因限制了这一点,那就是不允许浏览器中的小程序占用用户的所有内存。微软VM从未有过这样的限制,实际上可以做到这一点,这可能会导致某种形式的拒绝服务攻击针对用户的计算机。只有一年前,Sun在1.6.0更新10 VM中引入了一种方法,让小程序指定他们想要多少内存(限制为一定比例的物理内存),而不是总是将它们限制在64MB,即使在有8GB或更多可用内存的计算机上。
现在,由于JVM已经发展,当VM不在浏览器内运行时,应该可以摆脱这种限制,但是Sun显然从未认为这是一个高优先级的问题,尽管已经提交了无数的错误报告来最终允许堆增长。
我个人认为这与操作系统上运行的其他应用程序的内存管理有关。
如果您将最大堆大小设置为例如RAM上的数量,您实际上让虚拟机决定它需要多少内存(最高限度为此)。这样做的问题是,虚拟机在决定需要进行垃圾回收之前,可能会占用盒子上的所有内存,从而有效地使其运行的机器变得不稳定。
当您指定最大堆大小时,您向虚拟机发出的信号是,您可以在需要开始垃圾回收之前使用这些内存量。您不能拥有更多,因为如果您占用了更多,则运行在该盒子上的其他应用程序将变慢,并且如果您使用超过此限制,则将开始交换到磁盘。
还要注意,内存有两个相关的值,即“当前堆大小”和“最大堆大小”。当前堆大小是堆当前使用的内存量,如果需要更多,则可以调整堆的大小,但它不能将堆大小调整到超过最大堆大小的值。