
基础篇-27-方法区的回收
在 Java 中,方法区(Method Area)是 JVM 内存的一部分,用来存储类信息、常量、静态变量和即时编译器编译后的代码等。它相当于 JVM 的 "类存储区"。方法区的回收与垃圾回收(GC)相关,但其机制稍微特殊。
方法区的回收
方法区回收主要包括以下几个方面:
-
垃圾回收的对象:
- 方法区中的回收主要针对无用的类信息进行清理。具体来说,当类不再被使用,或者类加载器被卸载时,方法区可以进行回收。
- 其中,类卸载是方法区回收的一个关键。类一旦没有被任何对象引用,且类加载器被卸载时,类的信息就会被回收。
-
回收的触发:
- 方法区的回收不像堆区那样自动进行。垃圾回收器在清理堆区时并不会主动去回收方法区的数据。方法区的垃圾回收通常是由 JVM 的内存管理策略触发的,例如 JVM 内存溢出、类加载器的卸载等。
-
JVM 参数:
- 在 JVM 启动时,方法区的内存大小可以通过以下参数进行配置:
-XX:PermSize=<size>:设置方法区初始内存大小(旧的JVM版本中使用)。-XX:MaxPermSize=<size>:设置方法区最大内存大小(旧的JVM版本中使用)。- 在 JDK 8 及以后版本中,永久代(PermGen) 被移除,替换为元空间(Metaspace)。元空间使用本地内存(native memory),并不再是 JVM 堆的一部分,因此也不受
-XX:MaxPermSize的限制。
- 在 JVM 启动时,方法区的内存大小可以通过以下参数进行配置:
-
JDK 8 以后:
- JDK 8 之后,方法区变成了 元空间(Metaspace),元空间并不在堆内存中,而是使用本地内存。因此,元空间的回收机制与堆区有所不同。元空间的垃圾回收是由 JVM 自动管理的,它会在方法区内存使用超过某个阈值时进行回收。
-
类加载器的回收:
- 当某个类加载器不再使用并且其所加载的类也没有引用时,类加载器会被回收,进而可以回收其中存储的类信息。
总结:
方法区的回收机制虽然没有堆区的垃圾回收那么频繁,但它依然会定期进行回收,尤其是类卸载和类加载器的卸载时,回收方法区中的无用数据。随着 JDK 8 的推出,永久代被替代为元空间,因此方法区的回收方式也发生了改变,更多依赖本地内存的管理。
方法区 理解
明白了,方法区是放 类模具的, 只有 堆里的 这个类的 对象 都释放了, 这个模具才会被释放
白学,方法区放模具的,本来就不大,回收意义不大,
方法区本身的内存相对较小,通常它并不是 JVM 内存中的主要消耗区域。虽然方法区会存储类的信息和元数据,但由于在 Java 程序中类的数量一般不会像堆中的对象那样庞大,因此方法区的内存压力并不像堆区那么大。
另外,随着 JDK 8 引入元空间(Metaspace),原本占用方法区的 永久代 被移除,元空间的管理更灵活,它不再依赖 JVM 堆内存,而是使用本地内存。所以,元空间的内存管理和回收机制变得更加高效和独立。尽管如此,元空间的内存也会在一定条件下回收,尤其是类加载器卸载时。
因此,虽然方法区(尤其是元空间)有回收机制,但由于它通常占用的内存较少,且类和方法的加载频率也比堆中的对象低,它的回收意义确实没那么大,更多是为了避免内存泄漏或由于类加载过多导致内存不足的情况。
简而言之,方法区的回收并不是像堆区那样频繁,更多是在程序长时间运行,或者有大量的类加载和卸载时,才会涉及到它的回收。对大部分程序来说,这部分内存的使用和回收不太会成为瓶颈。
总的来说,你的理解是准确的,方法区对 JVM 的内存使用影响相对较小,回收的意义也相对较低。















755

被折叠的 条评论
为什么被折叠?



