PermGen和Metaspace有什么区别?

Kao*_*Kao 107 java permgen java-7 java-8 metaspace

在Java 7之前,JVM内存中有一个名为PermGen的区域,JVM用于保存其类.在Java 8中,它被删除并被称为Metaspace的区域取代.

PermGen和Metaspace之间最重要的区别是什么?

我知道的唯一区别是java.lang.OutOfMemoryError: PermGen space不能再抛出并MaxPermSize忽略VM参数.

Mat*_*amn 128

与用户观点的主要区别 - 我认为之前的答案不够强调 - 默认情况下Metaspace会自动增加其大小(直到底层操作系统提供的内容),而PermGen始终具有固定的最大大小.您可以使用JVM参数为Metaspace设置固定的最大值,但不能使PermGen自动增加.

在很大程度上,这只是名称的改变.回到引入PermGen时,没有Java EE或动态类(un)加载,所以一旦加载了类,它就会被卡在内存中,直到JVM关闭 - 因此永久生成.现在,可以在JVM的生命周期中加载和卸载类,因此Metaspace对于保留元数据的区域更有意义.

它们都包含java.lang.Class实例,并且它们都遭受ClassLoader泄漏.唯一不同的是,使用Metaspace默认设置,它需要更长的时间,直到您注意到症状(因为它会尽可能多地自动增加),即您只是将问题推得更远而不解决它.OTOH我想象用完内存操作系统内存的效果可能比仅运行JVM PermGen更严重,所以我不确定它有多大的改进.

无论您是使用带有PermGen的JVM还是使用Metaspace,如果您正在进行动态类卸载,您应该对类加载器泄漏采取措施,例如使用我的ClassLoader Leak Prevention库.

  • Permgen和Metaspace都不包含Class类的实例.它们只保留有关已加载类的元信息.类Class的实例保存在常规堆中,就像其他类的实例一样. (12认同)
  • 顺便说一句,OTOH 的意思是“另一方面” (4认同)

Ank*_*hal 37

再见,Bye PermGen,Hello Metaspace

PermGen已被完全删除.

元空间垃圾收集 - 一旦类元数据使用到达,就会触发死类和类加载器的垃圾收集MaxMetaspaceSize.

空间Metadata被保持不再是连续的Java heap,metadata现在已经移动到本地记忆到一个被称为的区域Metaspace.

简单来说,

由于类元数据是从本机内存分配的,因此最大可用空间是可用的总系统内存.因此,您将不再遇到OOM errors并最终溢出到交换空间.

删除PermGen并不意味着您的类加载器泄漏问题已经消失.所以,是的,你仍然需要监控你的消费并相应地计划,因为泄漏会最终消耗你的整个本机内存.

其他一些文章,分析:Link1,Link2这个

  • 而不是MaxPermGen你有MaxMetaspaceSize,所以没有理由它会使用更多或更少的内存或你有更少的控制. (6认同)
  • 我们在这里谈论的是什么记忆?RAM 内存或 HDD 内存。 (2认同)

小智 9

简而言之,如果不受限制,Metaspace大小会自动增加本机内存,以加载类元数据 -XX:MaxMetaspaceSize