当前位置: 首页 > 面试题库 >

PermGen和Metaspace有什么区别?

欧阳智志
2023-03-14
问题内容

直到Java 7为止,JVM内存中都有一个称为 PermGen 的区域,JVM用来保留其类。在Java
8中
,已将其删除并替换为名为 Metaspace 的区域。

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

我知道的唯一区别是,java.lang.OutOfMemoryError: PermGen space不再可以抛出该异常,并且MaxPermSize忽略了VM参数。


问题答案:

从用户角度来看,主要的区别(我认为先前的答案不够强调)是, 默认情况下Metaspace自动增加
其大小(达到基础操作系统所提供的大小),而PermGen始终具有固定的最大大小。您可以使用JVM参数为Metaspace设置固定的最大值,但不能使PermGen自动增加。

在很大程度上,这只是名称的更改。早在引入PermGen时,就没有Java
EE或动态类的加载(卸载),因此一旦加载了类,它就一直停留在内存中,直到JVM关闭为止,从而实现了 永久
生成。如今,可以在JVM的生命周期内加载和卸载类,因此对于保留元数据的区域,Metaspace更有意义。

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

无论您是将JVM与PermGen一起使用还是与Metaspace一起使用,如果要进行html" target="_blank">动态类卸载,都应采取措施防止类加载器泄漏,例如,使用我的ClassLoader
Leak Prevention库。



 类似资料:
  • 在Java 7之前,JVM内存中有一个名为PermGen的区域,JVM以前在这里保存它的类。在Java 8中,它被移除并被称为元空间的区域所取代。 PermGen和Metaspace之间最重要的区别是什么? 我知道的唯一区别是,并且忽略了VM参数。

  • 问题内容: 两者都意味着空间,但是有什么区别吗? 问题答案: 一个是不间断空间,另一个是常规空间。不间断的空格表示该行不应在该点处换行,就像它不会在一个单词的中间换行一样。 此外,正如斯文德(Svend)在其评论中指出的那样,不间断的空间不会崩溃。

  • 本文向大家介绍<%# %> 和 <% %> 有什么区别?相关面试题,主要包含被问及<%# %> 和 <% %> 有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 答:<%# %>表示绑定的数据源 <%%>是服务器端代码块  

  • 问题内容: 我试图了解HotSpot JVM的内存结构,并将其与 “方法区域” 和 “ PermGen” 空间这两个术语混淆了。我提到的文档说“方法区域”包含类和方法的定义,包括字节码。其他一些文档说它们存储在PermGen空间中。 那么我可以得出结论,这两个内存区域 相同 吗? 问题答案: 您应该查看Java内存类型,以及有关Java 垃圾收集的此文档(可选)。后者非常冗长,两者都很有用。 实际

  • 问题内容: 以下代码之间有什么区别: 和 Python建议采用一种做事方式,但有时似乎不止一种。 问题答案: 一个是函数调用,一个是文字: 使用第二种形式。它更具Python风格,并且可能更快(因为它不涉及加载和调用单独的函数)。

  • 发展至今(2020 年 6 月份),GCC 编译器已经更新至 10.1.0 版本,其功能也由最初仅能编译 C 语言,扩增至可以编译多种编程语言,其中就包括 C++ 。 除此之外,当下的 GCC 编译器还支持编译 Go、Objective-C,Objective-C ++,Fortran,Ada,D 和 BRIG(HSAIL)等程序,甚至于 GCC 6 以及之前的版本还支持编译 Java 程序。但本