当前位置:网站首页>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. 分代垃圾回收机制
边栏推荐
- YOLOv7改进之二十二:涨点神器——引入递归门控卷积(gnConv)
- Jar a key generation document database
- Redis persistence method
- JS get parameter value of URL hyperlink
- 【每日一题】899. 有序队列
- 七夕活动浪漫上线,别让网络拖慢和小姐姐的开黑时间
- In V8 how arrays (with source code, picture and text easier to understand)
- CAS: 178744-28-0, mPEG-DSPE, DSPE-mPEG, methoxy-polyethylene glycol-phosphatidylethanolamine supply
- Go编译原理系列7(Go源码调试)
- Scala基础【正则表达式、框架式开发原则】
猜你喜欢
ML's yellowbrick: A case of interpretability (threshold map) for LoR logistic regression model using yellowbrick based on whether Titanic was rescued or not based on the two-class prediction dataset
Redis persistence method
The super perfect layout has shortcut keys and background replacement
学习笔记 | uiautomation(如何)实现自动化
FinClip, help smart TV more imagination
超级完美版布局有快捷键,有背景置换
Three.js入门详解
Graph-node:创建一个新的subgraph
用两个栈模拟队列
【杂项】通过Excel为字符串产生条码
随机推荐
ML's yellowbrick: A case of interpretability (threshold map) for LoR logistic regression model using yellowbrick based on whether Titanic was rescued or not based on the two-class prediction dataset
Fluorescein-PEG-CLS, cholesterol-polyethylene glycol-fluorescein scientific research reagent
The "interaction design" battle of the smart cockpit
P1449 后缀表达式
FinClip,助长智能电视更多想象空间
Unity2021 releases WebGL fog effect disappearing problem
vscode插件设置——Golang开发环境配置
BPF 可移植性和 CO-RE(一次编译,到处运行)
【MySQL —— 索引】
ts用法大全
用队列模拟实现栈
C语言实验十四 结构体
Minimized installation of debian11
免费的公共WiFi不要乱连,遭中间人攻击了吧?
Scala基础【正则表达式、框架式开发原则】
C语言实验十五 文件
Salesforce的中国区业务可能出现新变化,传言可能正在关闭
The world's first mass production, with the most fixed points!How does this AVP Tier1 lead?
MCS-51单片机,定时1分钟,汇编程序
OPC UA 与IEC61499 深度融合(1)