Java:为什么MaxPermSize存在?

时间:2010-07-28 18:10:53

标签: java jvm

为什么MaxPermSize存在?

7 个答案:

答案 0 :(得分:22)

这是一篇关于垃圾收集器中永久生成的好文章:

Presenting the Permanent Generation

上的

Jon Masamitsu's Weblog

编辑:

我还没有看到任何可以表明他们为什么做出设计决定对永久发电机尺寸有最大限制的事情。但我想这是出于几个原因。

  1. 它使实现起来更容易,GC显然是非常重要的,因此以任何方式简化您的实现可能是一个好主意。

  2. YAGNI(你不需要它)大多数应用程序加载固定数量的类,通常它们不是特别大,因此它们可能针对常见情况进行了优化,只选择了一个合理的默认值并使其可配置。 / p>

  3. 假设您的perm gen大小增长到不可预测的大,那么您可能在类加载器中出错(或者需要重新考虑您的体系结构)。即使在运行时生成类(或执行其他此类技巧)的应用程序中,生成的类的数量通常也是固定的,因此您应该能够调整maxperm以满足您的需求。

  4. 我不是java类加载和垃圾收集的所有细节的专家,但它们都是JVM的复杂部分,所以我想他们会尽量保持这两个组件尽可能正交,并允许因为perm gen动态增长可能会以复杂的方式将这两个组件耦合在一起(特别是因为两个组件都有严重的线程考虑因素)

  5. 限制最大perm生成可能有一些性能优势,允许它增长可能涉及额外的集合复制,或者它可能意味着你的perm生成不再存在于连续的地址空间中,这可能影响其他算法管理集合的方式。

  6. 显然这些都是猜测。但即使所有这些都是错误的我绝对不认为太阳选择固定尺寸是“愚蠢的”,可能会有更多的工程和实施方面的考虑因素,甚至超出我的梦想:)

答案 1 :(得分:6)

为了呈现略微不同的视角,IBM JVM没有permgen,而是转向操作系统并根据需要分配内存块。 (谣言是jrockit做同样的事情,但我无法确认。)

这是有利的,因为你不会达到(看似)任意限制,需要针对合法的增长情况进行调整。

另一方面,对于失控的应用程序(基本上是泄漏类)来说这是一个问题 - JVM基本上会占用地址空间中的所有内存。这可能导致错误,其中本机代码将突然失败malloc()调用,或Java以奇怪的方式破坏 - 如无法分配新线程(消耗堆栈的内存)。另一个缺点是它没有提供关于JVM的内存部分将消耗多少“成本确定性”。

所以这是一个权衡 - 你如何在“潜在的不良”情景中失败?

答案 2 :(得分:0)

它用于确定最大永久代的大小。在某些算法中,或者如果你使用很多很多很多不同的类,你可以使用它。给this one一个读数。

但大多数情况下它被用作考试中的问题......

答案 3 :(得分:0)

它的存在是因为它有助于调整JVM中的垃圾收集子系统。根据底层架构和内存管理,JVM实现可能具有次优的垃圾收集(例如,太过苛刻)......您可以手动指定MaxPermSize而不是计算它以使应用程序行为顺利...... < / p>

Java GC Page says more...

答案 4 :(得分:0)

永久生成用于保存VM本身的反射,例如类对象和方法对象。这些反射物体直接分配到永久世代中,并且其尺寸独立于其他世代。通常,可以忽略此代的大小,因为默认大小足够。但是,加载许多类的程序可能需要更大的永久代。

PermSize是用户设置的-Xmx值的额外单独堆空间。为永久生成保留的堆部分包含JVM的所有反射数据。如果应用程序动态加载和卸载大量类以优化性能,则应相应地调整大小。基本上,他堆存储对象,而perm gen保存有关其内部对象的信息。因此,堆越大,perm gen就越大。

默认情况下,对于-client,MaxPermSize为32mb,对于-server,为64mb。但是,如果未同时设置PermSize和MaxPermSize,则除非需要,否则整个堆不会增加。当你设置PermSize和MaxPermSize时,例如192mb,额外的堆空间将在它启动时被分配并保持分配。

答案 5 :(得分:0)

也许您希望为您的用户提供应用程序将占用多少内存的选项,是的,操作系统确实有限制并且无论如何都会停止它,但也许用户希望能够在应用程序设置中限制它因此,他们可以在当天晚些时候使用该内存执行其他操作而不会崩溃您的应用,因为它 ALREADY 占用了该空间而无法释放它,因为它正在使用它。因此,在设置菜单中,您有一个“我们使用的最大内存量”滑块,他们可以调整它,相应地调整MaxPermSize

答案 6 :(得分:0)

通过使用MaxPermSize设置,您的应用程序将在启动时抛出GC Out of Memory错误,这样您就不会认为您的应用程序已启动并且正在运行并让您的客户打电话,因为系统无法正常运行或非常缓慢

假设您的虚拟机上有4GB,并且您知道您的应用需要2GB的非烫发空间才能达到合同约定的性能指标。如果您的perm gen将占用超过2gb,那么启动应用程序是没有意义的,因为您将无法满足您的工作说明中列出的性能指标。

最好知道在启动时,获取更多内存,或重新配置VM以获取更多物理服务器内存(无论情况如何),而不是启动应用程序,允许类,ehcache或者其他任何要加载的东西,认为一切都很好,然后从客户那里了解到系统需要10秒才能加载页面。