当前位置:网站首页>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. 分代垃圾回收机制
边栏推荐
- Software testing is seriously involution, how to improve your competitiveness?
- 重新认识浏览器的渲染过程
- Another MySQL masterpiece published by Glacier (send the book at the end of the article)!!
- 七夕?new一个对象
- 孙宇晨受邀参加36氪元宇宙峰会并发表主题演讲
- Scala basics [regular expressions, framework development principles]
- 1067 Sort with Swap(0, i)
- 创建函数报错,提示DECLARE定义语法问题
- jav一键生成数据库文档
- BMN: Boundary-Matching Network for Temporal Action Proposal Generation Reading Notes
猜你喜欢
重新认识浏览器的渲染过程
Pytest学习-skip/skipif
complete binary tree problem
The super perfect layout has shortcut keys and background replacement
A simple understanding of TCP, learn how to shake hands, wave hands and various states
POE交换机全方位解读(上)
Another MySQL masterpiece published by Glacier (send the book at the end of the article)!!
Unity intercepts 3D images and the implementation of picture-in-picture PIP
软件测试内卷严重,如何提升自己的竞争力呢?
The principle and use of AOSP CameraLatencyHistogram
随机推荐
Super perfect version of the layout have shortcut, background replacement (solve the problem of opencv Chinese path)
rosbridge-WSL2 && carla-win11
简单了解下 TCP,学习握手和挥手以及各种状态到底是怎么样的
Kotlin - extension functions and operator overloading
2021年数据泄露成本报告解读
禾匠编译错误记录
初始 List 接口
Zilliz 2023 Fall Campus Recruitment Officially Launched!
RSS feeds WeChat public - feed43 asain
Creo9.0 绘制中心线
一文搞定 SQL Server 执行计划
Flutter教程之为什么 Flutter 是创业的最佳选择?
V8中的快慢数组(附源码、图文更易理解)
【MySQL —— 索引】
[Paper Reading] TRO 2021: Fail-Safe Motion Planning for Online Verification of Autonomous Vehicles Using Conve
Graph-node:创建一个新的subgraph
End-to-End Lane Marker Detection via Row-wise Classification
Salesforce的中国区业务可能出现新变化,传言可能正在关闭
Code Casual Recording Notes_Dynamic Programming_416 Segmentation and Subsetting
The curl using guide