我正在尝试编写一些简单的基于Spring的web应用程序,并将它们部署到Tomcat上。几乎立刻,我就遇到了使用-XX:MaxPermSize (以及-Xmx和-Xms)自定义Tomcat设置的需求;如果没有这一点,服务器很容易耗尽PermGen空间。
与其他垃圾收集语言相比,为什么Java VM会遇到这样的问题?通过比较X在Java、Ruby、Perl和Python中的“调优X内存使用量”,可以看出Java在Google中的点击率比其他语言的总和高出一个数量级。
我也会感兴趣的参考技术论文/博客文章/等,解释JVMs实现背后的设计选择,跨不同的JVM或与其他解释语言VM进行比较(例如,将Sun或IBM与Parrot进行比较)。为什么JVM用户仍然必须处理非自动调优的堆/永久大小,这是不是有技术上的原因?
发布于 2010-03-31 14:14:40
你的问题的标题有误导性(我知道不是故意的):PermSize问题(有很多这样的问题,几年前我是第一个诊断Tomcat/Sun问题的人之一,当时还没有关于这个问题的任何知识)不是PermGen的具体问题,而是Sun的具体问题。
如果您使用的VM不使用永久生成(例如,如果我没记错的话,就像IBM VM ),那么就不会有permgen问题。
所以这不是一个"Java“问题,而是一个Sun VM实现问题。
发布于 2010-03-31 12:59:33
与Ruby、Perl和Python相比,Java为您提供了更多关于内存的控制,而Ruby、Perl和Python则提供了更少的控制。Java的典型实现也非常需要内存(因为它有一种更高级的垃圾收集方法) wrt动态语言的典型实现...但是,如果您查看JRuby或Jython,您会发现这是而不是的语言问题(当这些不同的语言使用相同的底层VM时,内存问题几乎是均衡的)。我不知道是否有广泛的"Perl on JVM“实现,但如果有的话,我敢打赌它在内存占用方面与JRuby或Jython不会有太大的不同!
发布于 2010-03-31 13:26:16
Python/Perl/Ruby使用malloc()或其优化来分配它们的内存。堆空间的限制是由操作系统决定的,而不是由VM决定的,因此不需要像-Xmxn这样的选项。此外,垃圾收集更简单,主要基于引用计数。因此,需要微调的地方要少得多。
此外,动态语言倾向于使用字节码解释器而不是JIT编译器来实现,因此它们无论如何都不会用于性能关键型代码。
https://stackoverflow.com/questions/2550529
复制相似问题