当前位置:网站首页>JVM垃圾回收总结(未完待续)
JVM垃圾回收总结(未完待续)
2022-08-03 23:50:00 【斯沃福德】
JVM垃圾回收
1. 如何判断对象可以回收?
1.1 引用计数法
给对象添加一个计时器,
只要对象被其他对象引用,让记数+1; 若变量不再引用了,让记数-1 ;当引用为0则回收
缺点:当循环引用时会造成内存泄漏 !
A和B的引用记数都是1,而没有其他对象引用A或B,导致记数无法归零,造成内存泄露------------早期python虚拟机使用的引用计数法,而java用的是可达性分析法;
1.2 可达性分析法
【在垃圾回收前】,会对堆中的所有对象扫描,找出是否有对象被GC root根对象引用,如果是则不能被回收,反之一个对象没有被根对象直接/间接引用,则可以被回收。
哪些是GC root根对象?
1.系统类的对象
2. 本地方法栈引用的对象
3. 线程中虚拟机栈 栈帧所引用的对象
4. Monitor对象即正在加锁的对象
( GC root根对象指的是堆中的对象实体,而不是引用 )
1.3 强、软、弱、虚 引用
对于一个对象来说,只要有强引用的存在,它就会一直存在于内存中
如果一个对象只具有软引用,则内存空间足够,垃圾回收器就不会回收它; 如果内存空间不足了,就会回收这些对象的内存
一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的空间
如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收器回收。
平时用的所有引用都是强引用,即传统的引用,如new 对象把对象赋给引用变量,则这个变量强引用了刚刚的对象;除非当根对象不再引用时会被回收。当对象被强引用时,处于可达状态,不可能被回收,即使以后都不会用到,所以强引用是造成内存泄漏的主要原因
软引用用来描述一些还有用,但非必须的对象,
弱引用也是用来描述那些非必须的对象,但是强度比软引用更弱一些,弱引用关联的对象只能生存到下一次GC手收集发生为止
虚引用是最弱的一种引用关系,无法通过虚引用来取得对象实例,主要配合bytebuffer使用,给一个对象设置虚引用关联的目的在于能在这个对象被GC回收时收到一个系统通知。
2. 垃圾回收算法
2.1 标记-清除
使用可达性分析法,沿着GCroot的引用链去找,扫描整个堆中对象,如果对象被GCroot根对象引用,则保留
①将未被根对象引用的对象标记;
②清除;
优点:速度快,只需要将内存的起始地址做一个记录就完成了
缺点:容易产生内存碎片;清除后不会再对空闲的空间进行整理工作了,即空闲的空间不连续,当有大的新对象的时候,放不下!造成内存溢出;
2.2 标记-整理
第一个阶段和标记-清除中一样
①使用可达性分析法,将未被根对象引用的对象标记;
②通过紧凑技术解决标记-清除算法的内存碎片问题,通过将可用的对象向前移动,让内存更为紧凑,连续的空间更多;
优点:没有内存碎片
缺点:整理涉及到了对象的移动,对象移动涉及到引用地址的改变,效率较低;
标记-整理算法中对象可能会移动多次,而标记-复制算法中只需要移动一次。
2.3 标记-复制
①使用可达性分析法,在FROM区域,将未被GC root根对象引用的对象标记
②将FROM区域存活的对象,复制到TO区域,复制过程中会完成内存碎片的整理,复制完成后,FROM区域全是垃圾,
③清除FROM区域的所有垃圾
④交换FROM和TO区域
优点:不会产生内存碎片,只需要移动一次对象,而标记-整理算法是移动多次
缺点:占用双倍的内存空间
3. 分代垃圾回收机制
边栏推荐
- libnet
- 孙宇晨受邀参加36氪元宇宙峰会并发表主题演讲
- 3D Semantic Segmentation - 2DPASS
- 跨域的学习
- 智能座舱的「交互设计」大战
- Flutter教程之为什么 Flutter 是创业的最佳选择?
- BMN: Boundary-Matching Network for Temporal Action Proposal Generation Reading Notes
- The longest substring that cannot have repeating characters in a leetcode/substring
- Unity2021 releases WebGL fog effect disappearing problem
- 软件测试内卷严重,如何提升自己的竞争力呢?
猜你喜欢
随机推荐
用队列模拟实现栈
curl使用指南
Why Flutter Flutter of tutorials is the best choice for business?
rsync basic usage
【并发编程】ReentrantLock的lockInterruptibly()方法源码分析
jav一键生成数据库文档
Jmeter-参数化
IELTS essay writing template
Unity2021发布WebGL雾效消失问题
[2022安恒夏令营] 5个小题
二叉搜索树解决落叶问题
小身材有大作用——光模块寿命分析(二)
Creo 9.0二维草图的诊断:加亮开放端点
FinClip,助长智能电视更多想象空间
Free自由协议系统开发
射频芯片ATE测试从入门到放弃之参数测试
Another MySQL masterpiece published by Glacier (send the book at the end of the article)!!
SolidEdge ST8安装教程
一文搞定 SQL Server 执行计划
【杂项】通过Excel为字符串产生条码