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

2022-09-02 13:34:32

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

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

为什么不能告诉Java随着时间的推移尽可能多地增长堆/堆栈/permgen?


答案 1

原因三:

  1. 因为Java旨在成为一种编写Web应用程序的语言。通常不认为让 Web 应用接管所有计算机资源是一个好主意。
  2. 因为 Java 是垃圾回收的。除了指定内存上限外,堆大小还会触发垃圾回收。从本质上讲,你是在说“你可以使用这么多,但是当你达到这个限制时,你必须清理”。
  3. 有许多类应用程序,您确实希望限制Java进程使用的内存量,例如,当两者的内存不足时,其他进程继续运行更为重要。
  4. 因为能够限制堆大小是一项功能。如果您喜欢进程可以具有无限内存的方法(如提到的其他语言),则始终可以将堆限制设置为大于它可能获得的内存。如果要限制堆大小,可以执行此操作。其他语言只有这些可能的行为之一,这使得它们不那么灵活。

答案 2

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


推荐