一、判断对象是否能回收
思路一:引用计数
给这个对象里安排一个计数器, 每次有引用指向它, 就把计数器+1, 每次引用被销毁,计数器-1,当计数器为0的时候, 意味着该对象就是垃圾了
给引用技术分配了两个字节, 对象本体才4个字节, 引用计数就浪费了50%的空间
如果代码中都是这种小对象, 并且数量众多, 此时, 浪费就非常明显了
2. 可能存在循环引用的问题, 导致对象不能被正确识别为垃圾
思路二:可达性分析
JVM首先会从现有代码中的能直接访问到的引用出发, 尝试遍历所有能访问的对象,只要对象能访问到,就会标记成”可达“,完成整个遍历之后,可达之外的对象,也就是“不可达”,也就相当于垃圾了
1、标记清除
申请内存的时候, 都是申请连续的内存空间。 直接释放内存会破坏原有的连续性,导致还有剩余但是申请不了
2、复制算法
复制算法: 通过冗余的内存空间, 把有效对象复制到另一部分空间,来避免内存碎片
但是浪费一半空间
把一个内存,分成两份,用FROM清理FROM,搬到TO, 往复进行
接下来就可以使用右侧区域了, 用了一段时间后,也会有很多对象,也是同理,把有效对象复制会左边,对右侧进行统一释放
3、标记整理
把有效对象搬到一起, 统一删除元素, 当然这样搬运元素成本也比较高导致速度太慢
4.分代回收
1.生命周期特别特别短
2.生命周期特别特别长
新生代又分伊甸区 和 幸存区
①新创建的对象全部会放在新生代中的伊甸区, 再经历一轮GC后,剩余的还没挂的对象会通过复制算法,复制到幸存区 (幸存一轮后年龄+1)
②幸存区由两块区域组成, 每次只使用一块;对已使用区域使用复制算法转移至未使用区域(注意箭头指向)
③如果一个对象在幸存区中经过15轮都没挂 那就是生命周期特别长了,直接转移到老年代,在老年代中使用标记整理
老年代扫描频率比新生代低得多,并且即使扫描了大多数也不会被销毁,因此标记整理开销不大
新生代扫描频率虽然高,但是每轮留下的对象很少,复制算法的开销也不大
三、垃圾回收器
原文地址:https://blog.csdn.net/weixin_47786582/article/details/134768178
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_37006.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!