为什么Java VM中的内存管理如此明显?

时间:2010-03-31 04:39:15

标签: java memory-management jvm

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

与其他垃圾收集语言相比,为什么Java VM会出现这样的问题?比较Java,Ruby,Perl和Python中X的“调整X内存使用量”的计数,表明Java在Google中的点击量比其他语言的点击率高出一个数量级。

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

5 个答案:

答案 0 :(得分:7)

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

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

因此,这不是“Java”问题,而是Sun VM实施问题。

答案 1 :(得分:5)

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

答案 2 :(得分:1)

Python / Perl / Ruby使用malloc()或其优化来分配内存。堆空间的限制由操作系统而不是VM决定,因此不需要像-Xmxn这样的选项。此外,垃圾收集更简单,主要基于引用计数。因此微调的次数要少得多。

此外,动态语言倾向于使用字节码解释器而不是JIT编译器来实现,因此它们不会用于性能关键代码。

答案 3 :(得分:0)

@WizardOfOdds和@Alex-Martelli的答案的本质似乎是正确的:Java有一套高级GC选项,有时你需要调整它们。但是,我仍然不完全清楚为什么你可以设计一个有或没有永久代的JVM。我在Java中发现了一堆有关垃圾收集的有用链接,但不一定与其他使用GC的语言相比。简言之:

如果有人提供更多详细信息,请尽快更新此答案。

答案 4 :(得分:-1)

这是因为Tomcat在Java虚拟机中运行,而其他语言则是编译或解释并针对您的实际计算机运行。当您设置-Xmx和-Xms时,您说您希望JVM像计算机一样在设定范围内的某个位置运行。

我认为有这么多人参与其中的原因是默认值相对较低,人们很快就会达到默认上限(而不是等到你用完其他语言时用完实际的ram)