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

为什么内存管理在JavaVM中如此明显?,java,memory-management,jvm,Java,Memory Management,Jvm,我正在编写一些简单的基于Spring的web应用程序,并将它们部署到Tomcat上。几乎马上,我就需要使用-XX:MaxPermSize(以及-Xmx和-Xms)定制Tomcat的JVM设置;否则,服务器很容易耗尽PermGen空间 为什么与其他垃圾收集语言相比,Java虚拟机会遇到这样的问题?比较Java、Ruby、Perl和Python中X的“tunex内存使用”计数,可以发现Java在Google中的点击率比其他语言加起来要高出一个数量级 我还对解释JVM GC实现背后的设计选择、跨不同J

我正在编写一些简单的基于Spring的web应用程序,并将它们部署到Tomcat上。几乎马上,我就需要使用-XX:MaxPermSize(以及-Xmx和-Xms)定制Tomcat的JVM设置;否则,服务器很容易耗尽PermGen空间

为什么与其他垃圾收集语言相比,Java虚拟机会遇到这样的问题?比较Java、Ruby、Perl和Python中X的“tunex内存使用”计数,可以发现Java在Google中的点击率比其他语言加起来要高出一个数量级


我还对解释JVM GC实现背后的设计选择、跨不同JVM或与其他解释语言VM进行比较(例如,将Sun或IBM JVM与其他解释语言VM进行比较)的技术论文/博客文章等的参考资料感兴趣。JVM用户仍然需要处理非自动调整堆/永久大小的技术原因吗?

这是因为Tomcat在Java虚拟机中运行,而其他语言要么编译,要么解释,并在实际机器上运行。当您设置-Xmx和-Xms时,您的意思是希望JVM像计算机一样运行,ram的数量在设置的范围内


我认为这么多人陷入这种情况的原因是默认值相对较低,人们很快就达到了默认上限(而不是像其他语言那样等待实际内存用完).

Java让您对内存有了更多的控制——与Ruby、Perl和Python相比,Java让您对内存的控制更少,这是希望在那里应用该控制的人的第一个选择。Java的典型实现也非常需要内存(因为它有一种更高级的垃圾收集方法)wrt动态语言的典型实现。。。但是如果你看看JRuby或Jython,你会发现它不是一个语言问题(当这些不同的语言使用相同的底层VM时,内存问题几乎是相等的)。我不知道是否有广泛的“Perl-on-JVM”实现,但如果有,我敢打赌它在占用JRuby或Jython的空间方面不会有明显的不同

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


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

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

如果您使用的虚拟机不使用永久生成(比如说,如果我没弄错的话,可以使用IBM虚拟机),那么就不会出现永久生成问题


所以它不是一个“Java”问题,但是Sun VM实现的问题。

@WizadoFodds和@Alex Martelli的答案的本质似乎是正确的:Java有一组高级GC选项,有时需要对它们进行调优。但是,我仍然不完全清楚为什么要设计一个JVM,可以使用或不使用永久生成。我发现了一些有用的方法l关于Java中垃圾收集的链接,但与使用GC的其他语言相比不一定如此。简要地说:

  • sungc的发展非常缓慢,因为它部署在任何地方,人们可能依赖于它的实现中的怪癖
  • Sun有关于GC设计和选项的详细白皮书,例如
  • 有一个新的GC,称为G1 GC。Alex Miller有一系列相关的博客文章和技术论文的链接。但它仍然有一个永久的一代(和)
  • 在Sun上有一个有趣的博客,介绍垃圾收集的各种细节

如果有人有,很高兴用更多细节更新这个答案。

很多其他语言都运行在虚拟机上。没有理由虚拟机抽象必须包含固定数量的内存。那么为什么JVM有(需要?)一个天花板?为什么它不能足够灵活地在需要时从操作系统请求更多的内存?考虑JVM作为一个正式的虚拟机。它需要一个上限,因为你可能在一台机器上管理多个JVM,就像你做普通的VM一样。JVM/将/减少它的总堆。问题是JVM仍然很难动态地去。nomate(我的新词)。@mob“那么为什么JVM(需要?)有一个上限?为什么它不能足够灵活,在需要时从操作系统请求更多内存?”Sun JVM可以很容易地配置为这样做。这不是默认设置,因为您必须小心您的进程不会导致操作系统崩溃。是perl、python和rails(ruby不是rails!)标记真的很有必要吗?很公平;谢谢你清理了标记。Emil,在Google趋势中搜索Java、Ruby、Perl和Python。调优Java内存要高得多的原因是“Java”是一个比其他词搜索得多的词,因为Java的使用率比其他词高得多。不要将因果关系与巧合混淆。@uriDium Google Trends告诉您有人搜索某物的频率。估计的点击率告诉您Google找到了多少资源。无论如何,即使您使用“tune X内存使用率”/“X”进行规范化,java仍然比其他语言有更多的参数。这些参数是自动调整的,在大多数情况下,您不必使用它们。但是,在某些情况下,您希望能够控制其中一个或多个参数,并且可以对其进行更改。注意:不要因为您更改了值就认为您已经改进了