Java的回收算法
2020-07-23 本文已影响0人
bangbang2
参考链接:https://www.imooc.com/article/79492
回收的都是内存区域,GC回收的是堆区和方法区的内存。Jvm的回收机制是stop-the-world
除了垃圾回收的线程外,其他线程保持停止,等垃圾回收完再恢复。例如:垃圾不能一边捡一边扔
标记-****清除算法:比如对象,被引用的对象被引用就+1****,count****为0****就被回收
复制算法:将原来内存区域分为两块,要清除时,就将一块区域的所有东西移到空白的内存区域,将原来的区域全部清空
标记整理算法:把有用的对象标记后整理在一块区域,然后将另一端区域的内存清空。相当于前二者的结合
复制算法>****标记-****整理算法>****标记-****清除算法
![](https://img.haomeiwen.com/i12913154/512dfb7ee213b63c.png)
![](https://img.haomeiwen.com/i12913154/c0a67c6b02191f36.png)
Java中采用可达性分析
gc roots可以是:thread,class
1.JAVA虚拟机栈中的本地变量引用对象;
2.方法区中静态变量引用的对象;
3.方法区中常量引用的对象;
4.本地方法栈中JNI引用的对象
因为gc root选择的标准是:不被gc回收,方法区和栈的东西,肯定回收不了,gc root是当前存活的对象
![](https://img.haomeiwen.com/i12913154/efc438fd5c375897.png)
![](https://img.haomeiwen.com/i12913154/1afa9e96a4837394.png)
![](https://img.haomeiwen.com/i12913154/fc4fd98ecd0b0f8d.png)
![](https://img.haomeiwen.com/i12913154/1a255bc5f01e03e0.png)
![](https://img.haomeiwen.com/i12913154/183ebfd3c6112988.png)
基本意思:标记-清理,标记-整理适用于垃圾少的 copy算法适用垃圾多
检查是否为垃圾,用可达性分析