为什么Java VM中的内存管理如此可见?

Emi*_*Sit 21 java jvm memory-management

我正在编写一些简单的基于Spring的Web应用程序并将它们部署到Tomcat.几乎立即,我遇到了使用-XX:MaxPermSize(和-Xmx和-Xms)定制Tomcat的JVM设置的需要; 没有这个,服务器很容易耗尽PermGen空间.

与其他垃圾收集语言相比,为什么Java VM会出现这样的问题?比较Java,Ruby,Perl和Python中X的"调整X内存使用量"的计数,表明Java在谷歌中的命中率比其他语言的组合容易多了一个数量级.

我也有兴趣参考技术论文/博客文章/等解释JVM GC实现背后的设计选择,跨越不同的JVM或与其他解释语言VM进行比较(例如将Sun或IBM JVM与Parrot进行比较).是否有技术原因导致JVM用户仍然需要处理非自动调整堆/ permgen大小?

Syn*_*r0r 7

您的问题的标题是误导性的(不是故意的,我知道):PermSize问题(并且有很多问题,我是多年前第一个诊断Tomcat/Sun PermGen问题的人之一,当时没有关于这个问题的任何知识都不是Java特定的,而是Sun VM的特性.

如果您使用不使用永久生成的VM(例如,如果我没有弄错的话,就像IBM VM那样),您就不会遇到permgen问题.

所以它不是"Java"问题,而是Sun VM实现问题.


Ale*_*lli 5

Java让你对内存有了更多的控制 - 对那些希望在那里应用那个控件的人来说,打了一个,而不是Ruby,Perl和Python,这让你对它的控制较少.Java的典型实现也非常耗费内存(因为它具有更高级的垃圾收集方法)和动态语言的典型实现......但是如果你看看JRuby或Jython,你会发现它不是语言问题(当这些不同的语言使用相同的底层VM,内存问题几乎相等).我不知道广泛的"Perl on JVM"实现,但如果有一个我愿意打赌它在JRuby或Jython的足迹方面不会有明显不同!