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