在Java 7之前,JVM内存中有一个称为PermGen的区域,JVM用于保存其类。在Java 8中,它被删除并替换为称为Metaspace的区域。
PermGen和Metaspace之间最重要的区别是什么?
我所知道的唯一区别是不再会抛出java.lang.OutOfMemoryError: PermGen space
,并且VM参数MaxPermSize
将被忽略。
在Java 7之前,JVM内存中有一个称为PermGen的区域,JVM用于保存其类。在Java 8中,它被删除并替换为称为Metaspace的区域。
PermGen和Metaspace之间最重要的区别是什么?
我所知道的唯一区别是不再会抛出java.lang.OutOfMemoryError: PermGen space
,并且VM参数MaxPermSize
将被忽略。
java.lang.Class
实例,并且它们两者都受到ClassLoader泄漏的影响。唯一的区别在于,使用Metaspace默认设置时,需要更长的时间才能注意到这些症状(因为它会尽可能地自动增加),即您只是将问题推迟了而没有解决它。但另一方面,我想当操作系统内存不足时的影响可能比仅仅是运行出JVM PermGen更严重,因此我不确定这是否是实质性的改进。再见,PermGen,你好,Metaspace
PermGen已经完全删除。
Metaspace垃圾回收——当类元数据的使用量达到MaxMetaspaceSize
时,死亡类和类加载器的垃圾回收就会被触发。
以前存储Metadata
的空间不再与Java heap
相连续,现在metadata
已经移到了本地内存中的一个区域,称为Metaspace
。
简单来说,
由于类元数据是从本地内存分配的,因此最大可用空间是系统中的总可用内存。因此,您将不再遇到OOM错误
,而可能会溢出到交换空间。
删除PermGen
并不意味着您的类装入器泄漏问题已经解决。因此,是的,您仍需要监视您的消耗并进行相应的计划,因为泄漏会导致消耗整个本地内存。
-XX:MaxMetaspaceSize
限制,Metaspace大小会自动增大以满足加载类元数据所需的本机内存。PermGen
Metaspace
让我们简单来解释一下。
什么是 PermGen :
PermGen 是一个特殊的堆空间,与主内存堆分开。类元数据被加载到这里。
Java 7 :PermGen 是 JVM 跟踪已加载类的元数据的空间。
Java 8 :PermGen 被 Metaspace 取代,具有自动增加本地内存的能力,以满足加载类元数据的需求。