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