JVM的永久代,元空间中会发生垃圾回收吗---个人理解

本文探讨了FullGC的概念及其复杂性,详细解释了不同JDK版本中方法区的实现方式,包括永久代和元空间的特点,并分析了它们如何影响FullGC的发生。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

什么是full GC

先说一下结论,Full GC这个概念是没有官方定义的,而且含义还特别混乱,在不同地方表达的含义是不同的,需要就不同的场景分别进行讨论。
Full GC为一次特殊GC行为的描述,这次GC会回收整个堆的内存,包含老年代,新生代,metaspace等

方法区是一种规范
而永久代,元空间是它的具体实现

jdk8以前方法区的实现叫做永久代,这个永久代里包含了这样几部分内容:它可以存储类的信息(也就是类里面的成员变量,成员方法,构造器,还有类加载器),还有一块叫运行时常量池,常量池里有一个比较重要的就是我们通常俗称叫串池的东西,它正式的名称叫StringTable(字符串表名)。

jdk8使用元空间作为方法区的实现,这个元空间里会存储类,类加载器,常量池的信息,不过它已经不占用我们的堆内存了,换句话说它已经不是由jvm来管理它的内存结构了,它已经被移出到本地内存当中,本地内存就是操作系统内存
stringTable它不再放在方法区的实现里(元空间),它被移到了堆里面

永久代会发生垃圾回收

而1.7以前的jdk采用的是永久代作为方法区的实现,在1.7及以前的jdk版本,永久代的空间不足也会导致fullGC,
1.7以前,永久代空间如果设小了,就会触发整个堆的一次full
GC(注意是触发堆的full GC),经过这样的一次定位就初步定位到了是由于永久代空间不足导致了堆的full GC

元空间不会发生垃圾回收

1.8以后由于改成了元空间,它的垃圾回收就不是由java来控制了,元空间的默认情况下内存空间是使用的操作系统的内存空间,所以空间的容量是比较充裕的,不会发生元空间的空间不足问题。

评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值