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

标签 java jvm jvm-arguments

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

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

为什么不能告诉 Java 随着时间的推移根据需要增长堆/堆栈/permgen?

最佳答案

三个原因:

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

关于java - 为什么需要指定 Java 堆大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3516664/

相关文章:

java - 使用 JOptionPane 接收用户的输入

java - 在 Java 中计算可用内存的最佳方法是什么?

memory-leaks - jetty 7 : OutOfMemoryError: PermGen space on application redeploy

java - 从 java ProcessBuilder 启动 Matlab,Matlab 控制台不会出现在 Mac OS 10.8 中

java - Apache Storm - 如何在生产集群中排除 Maven 中的storm jar

java - 从类路径打开 H2 数据库

java - 当文件确实存在时抛出 FileNotFoundException

用于 super 方法的 Java vtable

java - 为什么 "PrintThreads"vm op 会导致应用程序中的长时间 vm 暂停?

java - -Djava.library.path 中的多个目录