我一直想知道,为什么 Java 需要你手动设置堆大小?我的印象是,用其他语言编写的程序只会根据程序运行的需要分配尽可能多的内存,直到操作系统无法再分配。
在 Java 世界中,我们需要设置堆、堆栈和 permgen 大小。虽然这很简单,但忘记将这些增加到“足够大”的数字是我看到服务器宕机的第一大原因。
为什么不能告诉 Java 随着时间的推移尽可能多地增长堆/堆栈/permgen?
我一直想知道,为什么 Java 需要你手动设置堆大小?我的印象是,用其他语言编写的程序只会根据程序运行的需要分配尽可能多的内存,直到操作系统无法再分配。
在 Java 世界中,我们需要设置堆、堆栈和 permgen 大小。虽然这很简单,但忘记将这些增加到“足够大”的数字是我看到服务器宕机的第一大原因。
为什么不能告诉 Java 随着时间的推移尽可能多地增长堆/堆栈/permgen?
三个原因:
我的解释是 Sun 是一家专注于销售 Big Box 的公司,他们喜欢系统管理员可以在这些盒子上做事。运行一个系统来填满所有内存是一个很好的方法来运行它并且不能有效地采取行动来恢复操作,因为你不能分配内存来创建一个登录 shell。
我认为因为计算机的实际内存是有限的。因此,从某种意义上说,JVM 允许您在所有内存被浪费之前检测到 memleaks。
另外,如果您在同一台机器上运行多个 JVM 该怎么办——在这种情况下,您如何允许每个 JVM “按需增长”?
因为动态地增加堆、堆栈和 permgen 大小只会使服务器停止运行。在这样的世界中,服务器最终会泄露其所有资源。
此外,开发自动内存管理并不像今天这样成熟。如果您选择错误的默认值,拥有虚拟限制会使事情变得更容易,但它会使后端的编码效率降低一些。
是的,这些都是猜测,但都是合理的;尤其是当您考虑 Java 的 / Oak 的嵌入式机顶盒编程起源时。嵌入式系统不会有交换或磁盘支持的虚拟内存,那么为什么要让 JVM 表现得好像它是可用的一样呢?