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

2022-09-02 04:43:56

我正在尝试编写一些简单的基于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与Parrot进行比较)。为什么 JVM 用户仍然必须处理非自动调整堆/permgen 大小,这在技术上是否有原因?


答案 1

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

如果您使用的虚拟机不使用永久生成(例如,如果我没有记错的话,IBM虚拟机),则不会出现永久生成问题。

所以这不是一个“Java”问题,而是一个Sun VM实现问题。


答案 2

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