永久代堆空间和元空间
这个 JVM 内存空间的简短演示探讨了 Java 虚拟机如何处理用户数据内存分配。 虽然我们不会用图表来介绍这个主题,但它是相当基础的,我们相信我们的解释足以让您清楚。
此外,我们还将比较 PermGen 和 Metaspace 以及两者。 这篇简短的文章为您提供了大量信息。
Java中的永久生成堆空间
PermGen 是 Java 虚拟机使用的永久生成堆空间的缩写形式。 它是占据所有类、方法、对象、内化字符串等的空间。
对于大多数应用程序来说,永久生成对垃圾收集器的效率没有明显的影响。 然而,某些应用程序会动态创建和加载许多类,例如 JSP。
如果出现这种情况,我们可以使用命令行来增加 MAX: PermGen 的大小。 增加 MAX: PermGen Size 的命令:-XX:MaxPermSize=SIZE, -XX:PermSize=[size]
。
但这里需要记住一件事。 由于 Java 在 Java 开发工具包版本 8 版本中删除了此内存空间,因此如果我们在 Java 8 或更高版本中使用这些调整标志,我们将收到这些警告。
>> java -XX:PermSize=100m -XX:MaxPermSize=200m -version
OpenJDK 64-Bit Server VM warning: Ignoring option PermSize; support was removed in 8.0
OpenJDK 64-Bit Server VM warning: Ignoring option MaxPermSize; support was removed in 8.0
Java 中 PermGen 的主要特征
PG也包含在完整的垃圾回收中:
- JVM 类元数据的空间。
- Hotspot 中 Java 类的内部表示。
- 有关类结构、字段和标识符的信息。
- 有关方法编译和字节码的信息。
- 变量
- 始终在线的池和符号解析。
PermGen 的常见问题:
- MaxPermSize 的内存有限。
- 较大的 MaxPermSize 会导致重新启动。
- 内存不足错误问题。
- 由于应用程序引用而触发了类卸载。
- MaxPermSize(仅限 64 MB 至 85 MB)。
Java 中的永久代 (PermGen) 与元空间 (Metaspace)
从 Java 8 开始,我们看到 PermGen 被 Metaspace 取代。 这一变化也普遍存在细微的差异。
例如,Metaspace 具有无限的默认最大大小,而前者则没有。 如果我们阅读官方文档,我们会了解到 PermGen 在 32 位 JVM 上的默认最大大小为 64 MB。
同样,它在 Java 7 及更早版本中的 64 位 JVM 上有 82 MB。 但现在您知道内存不足错误不再是问题了。
难道我们不应该探索元空间吗? 显然,是的。
元空间(Java 8)
请将其视为一个容器,Java VM 保存您的内存(例如类、方法、变量、字符串等)的地方,因为我们已经指出了旧内存空间与此内存空间之间最重要的区别。
那么事不宜迟,让我们来看看Metaspace有什么不同?
下表对 Metaspace 和 PermGen 进行了比较和对比。
序号 | 永久代 | 元空间 |
---|---|---|
1 | PermGen Space 在 Java 8 中被淘汰。 | 新的空间元空间取代了它,它随 Java 8 一起发布。 |
2 | 正如其名称所示,它始终具有恒定的内存大小。 | 根据操作系统动态分配内存。 |
3 | 无效的垃圾收集器 (GC)。 | 有效气相色谱 |
总结
尽管这是一篇简短而切中要点的文章,但我们还是对永久代和元空间内存空间、垃圾收集器的角色以及 JVM 如何构建所有这些空间进行了简短的描述。
除此之外,我们还通过实时示例来区分每一个,并引用了有用的参考资料。 简而言之,永久代仍然存在于 JDK 7 及更早版本中。
另一方面,元空间为我们的应用程序提供了更可靠、更灵活的内存空间。
相关文章
Java 中从 java.util.date 转为 java.sql.date
发布时间:2023/08/11 浏览次数:190 分类:Java
-
在本文中,我们将讨论如何使用两个方法 - getTime() 和 valueOf(),将 java.util.Date 转换为 java.sql.Date。
在 Java 日期中获取当前时间戳
发布时间:2023/08/11 浏览次数:177 分类:Java
-
这篇文章是关于获取 Java Date 中的当前时间戳的。本文介绍如何获取 Java 中的当前时间戳,并列出一些示例代码以了解该主题。
获取 Java 中的当前年份
发布时间:2023/08/11 浏览次数:145 分类:Java
-
在本文中,讨论了如何在 Java 中获取当前年份的不同方法。在 Java 中使用 java.Util.Date 类获取当前年份
Java 中 SimpleDateFormat 类中的日期格式
发布时间:2023/08/11 浏览次数:195 分类:Java
-
本文将向你展示 Java 的 SimpleDateFormat 类中可用的日期格式。Java 中 SimpleDateFormat 类中的日期格式
如何在 Java 中为日期增加一天
发布时间:2023/08/11 浏览次数:156 分类:Java
-
在本文中,我们将学习如何在 Java 中将日期增加一天。这可以通过使用各种方法来完成,例如 plusDays 方法,Calendar 类方法,向 Date 对象添加毫秒以及 Instant class 方法。如果你使用的是 Java 1.8 或
如何在 Java 中比较两个日期
发布时间:2023/08/11 浏览次数:190 分类:Java
-
在本文中,我们将学习多种方法来比较 Java 中的日期。为了获得理想的结果,我们可以用以下的方法,即 before(),after(),equals() 和 compareTo()。
如何在 Java 中从数组创建数组列表
发布时间:2023/08/11 浏览次数:134 分类:Java
-
本文将介绍在 Java 中从数组创建数组列表的不同方法。在 Java 中,有三种不同的方法可以将数组转换为数组列表,如 Arrays.asList()、Collections.addAll() 和 add()。
如何在 Java 中打印 ArrayList
发布时间:2023/08/11 浏览次数:154 分类:Java
-
在本文中,我们将介绍在 Java 中打印 ArrayList 的多种方法。我们的 Arraylist 将包含一个名为 ModelClass 的类对象,它有一个变量 name 和 getter/setter 函数。
如何在 Java 中创建二维 ArrayList
发布时间:2023/08/11 浏览次数:94 分类:Java
-
在本文中,我们将介绍两个关于如何创建二维 ArrayList 的 Java 方法。在 Java 中使用固定大小的 ArrayList 创建二维 ArrayList