gpt4 book ai didi

java - PermGen 和 Metaspace 有什么区别?

转载 作者:IT老高 更新时间:2023-10-28 11:23:49 27 4
gpt4 key购买 nike

在 Java 7 之前,JVM 内存中有一个名为 PermGen 的区域,JVM 用来保存它的类。在 Java 8它被移除并被称为 Metaspace 的区域所取代。

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

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

最佳答案

从用户的角度来看,主要区别(我认为之前的答案并不够强调)是 Metaspace 默认自动增加它的大小(达到底层操作系统提供的大小),而 PermGen总是有一个固定的最大尺寸。您可以使用 JVM 参数为 Metaspace 设置一个固定的最大值,但您不能使 PermGen 自动增加。

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

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

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

关于java - PermGen 和 Metaspace 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27131165/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com