JVM精进之路

JVM相关问题一网打尽
帅旋
关注
充电
IT宅站长,技术博主,架构师,全网id:arthinking。

不同版本的JDK的内存区域有什么不同?

发布于 2024-08-27 | 更新于 2024-08-27

为了优化 JVM 性能、简化 Java 应用的内存管理,并解决因为永久代有固定大小限制而导致的内存溢出问题。为此,在JDK升级过程中,逐渐用元空间取代了永久带。这样,JVM 的垃圾收集器可以更高效地管理内存,尤其是在处理大量动态生成类的应用程序时(例如,使用大量反射或动态代理技术的应用)。

为了更好的演示不同版本的JDK内存区域的不同,帅旋这里特意画了几张图来说明。

JDK 6:使用永久代实现方法区

image-20240420105657249

在 JDK 1.6 中,方法区主要用于存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。

方法区是 JVM 规范的一部分,而“永久代”(PermGen space)是 HotSpot JVM 对方法区的实现,这是一个固定大小的内存区域。

永久代的问题在于它有一个固定的内存限制,这使得如果加载了大量类或大量使用字符串的应用可能会遇到内存溢出错误。

常量池包括类常量池和运行时常量池,运行时常量池逻辑上包含字符串常量池。

JDK 7:逐步移除永久代

image-20240420105711442

JDK 1.7 开始了去永久代化的过程,尽管永久代仍然存在,但已经将字符串常量池从运行时常量池剖离开来了,从永久代移至 Java 堆中

JDK 8:彻底去除永久代,引入元空间(MetaSpace)

image-20240420105730175

到了 JDK 1.8,永久代被完全移除,取而代之的是元空间(MetaSpace)。元空间不在虚拟机内存中而是使用本地内存。类常量池和运行时常量池都移动到了元空间。

静态变量也在堆中分配

本文作者: 帅旋

本文链接: https://www.itzhai.com/columns/faqs/jvm/memory-management/differences-in-memory-areas-across-different-jdk-versions.html

版权声明: 版权归作者所有,未经许可不得转载,侵权必究!联系作者请加公众号。

×
IT宅

关注公众号及时获取网站内容更新。

请帅旋喝一杯咖啡

咖啡=电量,给帅旋充杯咖啡,他会满电写代码!

IT宅

关注公众号及时获取网站内容更新。