永久代你不知道的东西

一、在Java 7及之前的版本中,永久代(Permanent Generation)用于存储类的元数据信息、常量池等。

且当类不再被引用时,其对应的类加载器加载的类信息可以被卸载并回收。

二、永久代垃圾回收主要分2部分内容:废弃的常量和无用的类。

1.判断废弃常量:一般是判断没有该常量的引用。

2.判断无用的类,要以下三个条件都满足:

1)该类所有的实例都已经回收,也就是 Java 堆中不存在该类的任何实例。

2)加载该类的 ClassLoader 已经被回收。

3)该类对应的 java.lang.Class 对象没有被任何地方所引用,无法在任何地方通过反射访问该类的方法。

三、永久代可能会发生内存溢出(OutOfMemoryError: PermGen space)。可以采取以下措施来避免:

1.增加永久代大小:通过JVM参数-XX:MaxPermSize来设置永久代的最大大小。

2.类数据共享:使用JVM的Class Data Sharing(CDS通过将一组核心系统类(如java.lang.String)装载到共享内存中,使这些类可以在多个Java虚拟机之间共享)功能,可以减少永久代的内存占用。

3.使用JVM垃圾回收策略:如CMS GC(Concurrent Mark Sweep)的老年代回收策略,可以回收永久代中的不再使用的类元数据。

四、引申

从Java 8开始,永久代被元空间(Metaspace)所取代。元空间不再位于JVM的堆内存中,而是直接使用本地内存。这意味着元空间的大小只受本地操作系统的内存限制,不再有最大值限制,从而减少了永久代内存溢出的风险。相应的,JVM参数也发生了变化,即使用-XX:MaxMetaspaceSize来设置元空间的最大大小。


微风不燥,阳光正好,你就像风一样经过这里,愿你停留的片刻温暖舒心。

我是程序员小迷(致力于C、C++、Java、Kotlin、Android、Shell、JavaScript、TypeScript、Python等编程技术的技巧经验分享),若作品对您有帮助,请关注、分享、点赞、收藏、在看、喜欢,您的支持是我们为您提供帮助的最大动力。

欢迎关注。助您在编程路上越走越好!

相关推荐
wuminyu8 小时前
专家视角看Java字节码加载与存储指令机制
java·linux·c语言·jvm·c++
.小小陈.8 小时前
Linux 线程概念与控制:从底层原理到实战应用
linux·运维·jvm
callJJ9 小时前
Spring Data Redis 两种编程模型详解:同步 vs 响应式
java·spring boot·redis·python·spring
千寻girling10 小时前
《 Git 详细教程 》
前端·后端·面试
wbs_scy10 小时前
Linux线程同步与互斥(三):线程同步深度解析之POSIX 信号量与环形队列生产者消费者模型,从原理到源码彻底吃透
java·开发语言
light blue bird11 小时前
工序路径工站物料 BOM 协同组件
jvm
jinanwuhuaguo11 小时前
(第三十三篇)五月的文明奠基:OpenClaw 2026.5.2版本的文明级解读
android·java·开发语言·人工智能·github·拓扑学·openclaw
xmjd msup12 小时前
spring security 超详细使用教程(接入springboot、前后端分离)
java·spring boot·spring
Cosolar12 小时前
一文吃透 LangChain&LangGraph:设计理念、框架结构与内部组件全拆解
人工智能·面试·架构
9523612 小时前
SpringBoot统一功能处理
java·spring boot·后端