在 Java 7 之前,JVM 内存中有一个区域称为PermGen,JVM 用来保存其类的地方。在Java 8 http://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html它被删除并被称为区域的区域取代元空间.
什么是最重要的区别PermGen 和 Metaspace 之间?
我知道的唯一区别是java.lang.OutOfMemoryError: PermGen space
不能再抛出VM参数MaxPermSize
被忽略。
从用户的角度来看,主要的区别 - 我认为之前的答案没有足够强调 - 是元空间默认自动增加它的大小(取决于底层操作系统提供的大小),而 PermGen 始终具有固定的最大大小。您可以使用 JVM 参数为 Metaspace 设置固定的最大值,但不能使 PermGen 自动增加。
在很大程度上,这只是一个名称的改变。当 PermGen 被引入时,没有 Java EE 或动态类(卸载)加载,因此一旦类被加载,它就会卡在内存中,直到 JVM 关闭 - 因此永恒的一代。如今,类可能在 JVM 的生命周期内加载和卸载,因此元空间对于保存元数据的区域更有意义。
它们都包含java.lang.Class
实例并且他们都患有类加载器泄漏 http://java.jiderhamn.se/2011/12/11/classloader-leaks-i-how-to-find-classloader-leaks-with-eclipse-memory-analyser-mat/。唯一的区别是,使用元空间默认设置,您需要更长的时间才能注意到症状(因为它会尽可能地自动增加),即您只是将问题推得更远而不解决它。 OTOH 我想耗尽操作系统内存的影响可能比耗尽 JVM PermGen 更严重,所以我不确定这是否是一个很大的改进。
无论您使用带有 PermGen 还是 Metaspace 的 JVM,如果您正在进行动态类卸载,则应该采取措施防止类加载器泄漏,例如使用我的类加载器泄漏预防库 https://github.com/mjiderhamn/classloader-leak-prevention.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)