为什么我们必须增加Java堆?

为什么我们必须增加Java堆?,java,Java,我知道如何在Tomcat和Eclipse中设置Java堆大小。我的问题是为什么?最初引入Java时,初始堆上是否设置了任意限制,以使VM不会增长到一定的大小?现在的大多数机器都有很大的可用内存空间,这似乎不是我们必须处理的问题。 谢谢 Tom即使现在,堆也不会无限增长 当最早的一代已满时,您应该扩展它还是只使用GC?或者,您应该仅在GC不释放任何内存的情况下扩展它吗 NET采用了您喜欢的方法:您不能告诉它只使用一定数量的堆。有时候感觉这是个更好的主意,但是其他时候,在同一台机器上有两个进程,并且

我知道如何在Tomcat和Eclipse中设置Java堆大小。我的问题是为什么?最初引入Java时,初始堆上是否设置了任意限制,以使VM不会增长到一定的大小?现在的大多数机器都有很大的可用内存空间,这似乎不是我们必须处理的问题。
谢谢
Tom

即使现在,堆也不会无限增长

当最早的一代已满时,您应该扩展它还是只使用GC?或者,您应该仅在GC不释放任何内存的情况下扩展它吗


NET采用了您喜欢的方法:您不能告诉它只使用一定数量的堆。有时候感觉这是个更好的主意,但是其他时候,在同一台机器上有两个进程,并且知道它们都不能占用整个内存,这是很好的…

我认为能够提供一个限制是很好的,这样,如果您有内存问题,它就不会占用所有的系统内存,只剩下重新启动选项。

I前几天看了一下,但我不确定这是否是你想要的:
-XX:+AggressiveHeap

此选项指示JVM推送 内存使用达到极限:总体 堆大小超过3850MB时 每个线程的分配区域是 256K,内存管理策略 尽可能长时间推迟收款, 和(从J2SE 1.3.1_02开始) 一些GC活动是并行完成的

因为此选项设置堆大小,所以请执行以下操作: 不要使用中的-Xms或-Xmx选项 与-XX连用:+AggressiveHeap。 这样做将导致选择失败 覆盖彼此的设置,以便 堆大小


不过,我不确定这是否真的意味着我认为这意味着什么——可以让JVM吞噬堆空间,直到它满意为止。然而,在大多数情况下,它听起来并不是一个好的选择。

Java是一个跨平台的系统。某些系统(如Unix和derviates)具有
ulimit
命令,允许您限制进程可以使用的内存量。其他人则不然。另外,Java有时是嵌入式运行的,例如在web浏览器中。你不希望一个坏掉的小程序让你的桌面崩溃(好吧,这至少是个想法,但小程序从来没有真正流行起来,但那是另一回事)。从本质上讲,这一选择是实现这一目标的关键基石之一

因此,虚拟机开发人员需要一个可移植的解决方案:他们在虚拟机上添加了一个选项,允许任何人(用户、管理员、web浏览器)控制虚拟机可以分配多少RAM。Java的各种用途的需求太多样化了,不能一刀切


今天,当你看移动设备时,这一点变得更加重要。你的桌面有2-8GB内存,但你的手机可能要少得多。对于这些事情,你真的不希望一个糟糕的应用程序让设备瘫痪,因为可能甚至没有一个用户可以检查。

更好的是,为什么我们不能同时拥有这两个呢。为什么我们不能将其定义为不断扩展或限制它呢?通常我希望将其视为一种操作系统功能。在不同风格的Unix中,您可以限制进程或用户内存的使用。它有助于保持机器的响应速度。在.NET情况下,如果一个应用程序可以占用所有内存,那么机器可能会忙于交换,以至于您甚至无法找到任务管理器来杀死它。因此,尽管Java的模型可能看起来过时了,但我真的很喜欢它——如果某些东西需要那么多内存,我希望提前知道,并在知情的情况下指定一个众所周知的最大值。@altCognito:应该有人可以提出一个不同的JVM实现,以这种方式运行只要给JVM一个非常非常大的限制,微软JVM对堆大小没有限制。这是一个特定于供应商的问题。