为什么我们需要增加Java堆的大小?

5

我知道如何在Tomcat和Eclipse中设置Java堆大小。但我的问题是,为什么要这样做呢?当Java首次引入时,是否对初始堆设置了任意限制,以防止虚拟机增长到一定大小?看起来,由于今天大多数机器都有大量可用内存,我们不应该再需要处理这个问题。

谢谢,
汤姆


微软JVM没有堆大小限制,这是一个供应商特定的问题。 - Thorbjørn Ravn Andersen
4个回答

6
即使到现在,堆仍然没有无限制地增长。
当最老一代满了时,你应该扩展它还是只进行垃圾回收?或者只有在垃圾回收不能释放任何内存时才进行扩展?
.NET采取了你喜欢的方法:你无法告诉它只使用某个特定大小的堆。有时感觉这是一个更好的主意,但其他时候能够在同一台机器上运行两个进程,并且知道它们都不能占用整个内存,这也是很好的。

更好的做法是,为什么我们不能两者兼备呢?为什么我们不能定义它以持续扩展或限制它。 - cgp
2
通常我希望将其作为操作系统的一个特性。在不同版本的Unix中,您可以对进程或用户内存使用设置限制。这有助于保持机器的响应性。在.NET的情况下,一个单独的应用程序可能会占用所有内存,导致机器变得非常忙碌并进行换页,甚至无法打开任务管理器来终止它。因此,尽管Java的模型可能看起来过时,但我真的很喜欢它-如果某些东西需要那么多内存,我希望在事先知道并分配一个众所周知的最大值。 - Daniel Schneller
@altCognito:应该有可能让其他人开发出一种不同的JVM实现,以此来实现这种行为。 - matt b
只需为jvm设置一个非常非常大的限制,它就可以被视为无限制的。 - james

4
我前几天看到了这个,但我不确定这是否是你想要的:-XX:+AggressiveHeap。根据Sun公司的说法(链接):
该选项指示JVM将内存使用推至极限:总堆大小超过3850MB,每个线程的分配区域为256K,内存管理策略尽可能地延迟收集,并且(从J2SE 1.3.1_02开始)一些GC活动并行执行。
由于此选项设置了堆大小,请勿与-Xms或-Xmx选项一起使用-XX:+AggressiveHeap。这样做会导致选项覆盖彼此对于堆大小的设置。
虽然我不确定这是否意味着您可以让JVM吞噬堆空间直到满意,但它似乎不是大多数情况下使用的好选择。

0
我认为提供一个限制是很好的,这样如果你遇到内存问题,它就不会吞噬所有系统内存,只留下重新启动的选项。

0

Java是一个跨平台系统。一些系统(如Unix及其衍生版本)有一个ulimit命令,允许您限制进程使用的内存量。而其他系统则没有这个功能,同时Java有时会嵌入应用程序中,例如在Web浏览器中。您不希望一个破损的小程序导致您的桌面崩溃(好吧,这至少是这个想法,但小程序从来没有真正流行过,但这是另一种故事)。本质上,这个选项是沙箱的关键基石之一。

因此,VM开发人员需要一个便携式的解决方案:他们向VM添加了一个选项,允许任何人(用户、管理员、Web浏览器)控制VM可以分配的最大RAM量。Java的各种用途的需求太多样化了,无法使用同一种尺码适配所有情况。

当您考虑移动设备时,这变得更加重要。您的台式机可能拥有2-8GB RAM,但您的移动设备可能还要少得多。对于这些设备,您真的不希望一个糟糕的小程序导致设备崩溃,因为可能甚至没有用户可以检查。


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