为什么需要指定Java堆大小?

时间:2010-08-18 21:02:31

标签: java jvm jvm-arguments

我一直在想,为什么Java要求你手动设置堆大小?我的印象是,用其他语言编写的程序只需要在程序运行时分配尽可能多的内存,直到操作系统不再分配为止。

在Java世界中,我们需要设置堆,堆栈和permgen大小。虽然这很简单但忘记将这些数字增加到“足够大”的数字是我看到服务器停机的第一个原因。

为什么不能告诉Java随着时间的推移增加堆/ stack / permgen?

4 个答案:

答案 0 :(得分:7)

三个原因:

  1. 因为Java旨在成为编写Web应用程序的语言。通常认为让Web应用程序接管所有机器资源不是一个好主意。
  2. 因为Java是垃圾收集的。除了指定内存的上限外,堆大小也会触发垃圾回收。从本质上讲,你说的是“你可以使用这么多,但当你达到这个极限时,你必须整理一下”。
  3. 有许多类别的应用程序,您确实希望限制Java进程使用的内存量,例如:当内存不足时,其他进程继续更为重要。
  4. 因为能够限制堆大小是一个功能。如果您喜欢该进程可以拥有无​​限内存的方法(与所提到的其他语言一样),那么您始终可以将堆限制设置为超出其可能获取的范围。如果要限制堆大小,可以这样做。其他语言只有其中一种可能的行为,使它们的灵活性降低。

答案 1 :(得分:5)

我的解释是,Sun是一家专注于销售Big Box的公司,他们喜欢系统管理员可以在这些盒子上做事。运行系统来填充所有内存是将其运行到地面并且无法有效采取操作来恢复操作的好方法,因为例如,您无法分配内存来创建登录shell。

答案 2 :(得分:4)

我认为因为计算机的实际记忆是有限的。因此,从某种意义上说,JVM允许您在浪费所有内存之前检测memleaks 另外,如果您在同一台机器上运行多个JVM,该怎么办 - 在这种情况下,您如何允许这些JVM中的每一个“尽可能多地”增长?

答案 3 :(得分:1)

因为动态地增加堆,堆栈和permgen大小会使服务器无论如何都会停止运行。在这样的世界中,服务器最终会泄漏其所有资源。

此外,开发自动内存管理并不像现在这样成熟。如果你选择了错误的默认值,那么拥有虚拟限制可以使事情变得更容易,但是它会使编码在后端的效率降低。

是的,这些是猜测,但是合理的;特别是当你考虑Java / Oak的嵌入式机顶盒编程的起源时。它不像嵌入式系统会有交换或磁盘支持的虚拟内存,那么为什么让JVM表现得像是可用的呢?