简单理解java中GC机制

前言

以下内容为本人个人理解,如有偏颇之处,请各位大佬指正;

关于java的gc

堆Heap是用来存储我们new出来的对象的;当heap存储满了的时候,内存就会爆掉,程序就挂了;所以我们需要对堆中的对象进行管理;
GC是Java的垃圾回收器,在Java中gc帮助我们自动处理、回收垃圾对象;

1.java中怎么判断对象是否需要被删除–GCRoot

java是基于GCRoot规则对对象进行回收:
1)常量区static常量所直接或间接引用的对象;全局的常量,不知道什么时候还会被使用,所以不进行垃圾回收;
2)被jvm栈中变量直接或间接引用的对象;可能还会被该变量调用,所以不进行回收;
3)被本地方法栈所直接或间接引用的对象;是系统底层使用的对象,不会被回收;

其余没有被引用指向的对象为垃圾对象,会定期被java中的另一个线程gc回收;我们也可以通过 System.gc(),建议垃圾回收器进行垃圾回收;

2.垃圾回收的简单思路

2.1 标记清理算法

2.1.1算法描述:
扫描堆内存,利用GCRoot对垃圾对象进行标记,标记后,等待gc的线程清除被标记的垃圾对象;
如下图:
在这里插入图片描述

2.1.2存在问题:
清理后会产生空间碎片;这种碎片空间大小不一,很难再充分利用,久而久之,会造成大量的空间浪费;如下图:
在这里插入图片描述

2.2 标记整理算法

2.2.1算法描述:
先对需要清理的对象进行标记,然后清理垃圾对象,清理完成后,对对象进行重新整理,是对象在堆内存的空间分布紧凑,避免空间碎片造成的空间浪费;
如下图:
在这里插入图片描述
2.2.2存在问题:
每次清理后几乎要将所有对象移动,会耗费大量的资源;影响程序的性能

2.3 复制清理算法

2.3.1算法描述:
将堆内存分为两块空间,现在左边空间存储,当需要清理时,将没被标记的对象,紧凑的复制到右边,然后删除左边全部对象;
然后使用右边区域继续存储对象,循环往复;
如下图:
1.复制
在这里插入图片描述
2.删除清理
在这里插入图片描述

2.3.2存在问题:
堆内存的空间被一分为二,堆内存空间变小了;

3. 实际使用的回收机制

3.1 堆的空间分配

gc将存储对象的堆分为两大部分,一部分为年轻代,一部分为老年代;年轻代使用年轻代的gc机制YoungGC,老年代使用的是FullGC
在这里插入图片描述

3.2年轻代区域回收机制

3.2.1年轻代空间划分

将新生代分为:E(eden伊甸园,新生区)、S0(幸存0区Survivor)、S1(幸存1区)区域;大小比例默认为:8:1:1
因为大部分对象生命周期都非常短(朝生夕死),所以幸存区空间相对小一些;

3.2.2年轻代的对象回收机制

1)首先,新生的对象放入E区(新生区),新生代采用youngGC进行垃圾回收,先对内存所有对象进行基于GCRoot的标记,将幸存下来的对象全部紧凑的复制到S0(幸存0区Survivor);
2)下次清理时,将幸存下来的对象全部紧凑的复制到S1(幸存1区)区域,并清空s0区;
3)将E和s0区的复制到s1区,清空E区和s0区;下次回收将E区和s1区的复制到s0区,如此反复;
4) 一个对象每幸存一次,其年龄就会+1;当其年龄达到6;会被复制到老年代区域;
在这里插入图片描述

3.2老年代区域回收机制

1)在老年代中,存放的是长时间未被删除的对象(一般是在年轻代中经过6次回收幸存以后),还有大对象(如10万长度的int数组);
2)当老年代区域需要满了时,程序会停下,调用全部资源进行垃圾回收,老年区gc与新生代gc共同工作;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值