代码之家  ›  专栏  ›  技术社区  ›  Emil Sit

为什么内存管理在Java虚拟机中是可见的?

  •  21
  • Emil Sit  · 技术社区  · 16 年前

    我正在尝试编写一些简单的基于Spring的Web应用程序,并将它们部署到Tomcat中。几乎立刻,我遇到了使用-xx:maxpermsize(和-xmx和-xms)定制Tomcat的JVM设置的需求;如果没有这个,服务器很容易耗尽permgen空间。

    为什么Java VMS与其他垃圾收集语言相比,这是一个问题?比较爪哇、露比、Perl和Python中X的“曲调X内存使用”的计数,表明Java在谷歌中的命中数量比其他语言更容易命中数量级。

    我还想参考技术论文/博客文章/等,解释JVM GC实现背后的设计选择,跨越不同的JVM或与其他解释语言vm比较(例如,将Sun或IBM JVM与 Parrot )JVM用户仍然需要处理非自动调整堆/PermGen大小的技术原因是什么?

    5 回复  |  直到 14 年前
        1
  •  7
  •   SyntaxT3rr0r    16 年前

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

    如果您使用的是不使用永久代的虚拟机(比如说,如果我没有弄错的话,使用IBM虚拟机),那么您就不能有永久代问题。

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

        2
  •  5
  •   Alex Martelli    16 年前

    Java让你对内存有更多的控制——为想要的人敲击一个 应用 这里的控件与Ruby、Perl和python相比,后者提供了更少的控制权。Java的典型实现也是非常耗时的(因为它有一个更先进的垃圾收集方法)WRT动态语言的典型实现…但是如果你看Jruby或Jython你会发现 不 一个语言问题(当这些不同的语言使用相同的底层虚拟机时,内存问题几乎是相等的)。我不知道一个广泛使用的“JVM上的Perl”实现,但是如果有一个实现,我敢打赌,它在足迹方面与JRuby或Jython不会有明显的不同!

        3
  •  1
  •   dan04    16 年前

    python/perl/ruby使用malloc()或对其进行优化来分配内存。堆空间的限制由操作系统而不是虚拟机决定,因此不需要-xmxn这样的选项。此外,垃圾收集更简单,主要基于引用计数。所以要微调的地方要少得多。

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

        4
  •  0
  •   Bill the Lizard    14 年前

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

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

        5
  •  -1
  •   aubreyrhodes    16 年前

    这是因为Tomcat在Java虚拟机中运行,而其他语言是编译或解释的,并且与实际机器运行。当您设置-xmx和-xms时,您会说您希望JVM像一台RAM量在设置范围内的计算机一样运行。

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