GC三种算法

1.哪些对象会被回收

运用可达性算法 没有被GC Roots引用的对象都判定可被回收
例如下图:object 5,object 6,object 7均可被回收
在这里插入图片描述根对象的类型:
1.虚拟机栈中的引用的对象
2.方法区中的类静态属性引用的对象
3.方法区中的常量引用的对象
4.本地方法栈中JNI(Native方法)的引用的对象

如何回收

1.Marking-Sweep(标记-清除法)
先通过可达性算法标记存活的对象,再将堆中没有被标记的对象全部清除
缺点:
效率比较低(递归与全堆对象遍历)
而且在进行GC的时候,需要停止应用程序
这种方式清理出来的空闲内存不连续在这里插入图片描述2.标记-整理算法
先通过可达性算法标记存活的对象,移动所有存活的对象,且按照内存地址次序依次排列,然后将末端内存地址以后的内存全部回收。
优点:标记的存活对象将会被整理,按照内存地址依次排列,而未被标记的内存会被清理掉
缺点:标记/整理算法唯一的缺点就是效率也不高,不仅要标记所有存活对象,还要整理所有存活对象的引用地址。从效率上来说,标记/整理算法要低于复制算法。
在这里插入图片描述在这里插入图片描述在这里插入图片描述
3.复制算法
GC线程会将活动区间内的存活对象,全部复制到空闲区间,且严格按照内存地址依次排列,与此同时,GC线程将更新存活对象的内存引用地址指向新的内存地址。
优点:复制算法弥补了标记/清除算法中,内存布局混乱的缺点
缺点:
浪费50%内存
对象成活率比较高时,复制的过程中效率非常低

在这里插入图片描述在这里插入图片描述

新生代/老年代/永久代

Java 中的堆是 JVM 所管理的最大的一块内存空间,主要用于存放各种类的实例对象。
在 Java 中,堆被划分成两个不同的区域:年轻代 ( Young )、老年代 ( Tenured)。年轻代 ( Young ) 又被划分为三个区域:Eden、From Survivor、To Survivor。 这样划分的目的是为了使 JVM 能够更好的管理堆内存中的对象,包括内存的分配以及回收

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值