1.什么是垃圾回收机制
垃圾回收(Garbage Collection)是Java虚拟机(JVM)垃圾回收器提供的一种用于在空闲时间不定时回收无任何对象引用的对象占据的内存空间的一种机制。(jdk自动回收,或者手动System.gc())
2.什么时候进行垃圾回收
①会在cpu空闲的时候自动进行回收
②在堆内存存储满了之后
③主动调用System.gc()后尝试进行回收
补充:System.gc()用于调用垃圾收集器,在调用时,垃圾收集器将运行以回收未使用的内存空间。它将尝试释放被丢弃对象占用的内存。 然而System.gc()调用附带一个免责声明,无法保证对垃圾收集器的调用。
所以System.gc()并不能说是完美主动进了垃圾回收。
Java 中的引用类型
- 强引用:发生 gc 的时候不会被回收。
- 软引用:有用但不是必须的对象,在发生内存溢出之前会被回收。
- 弱引用:有用但不是必须的对象,在下一次GC时会被回收。
- 虚引用(幽灵引用/幻影引用):无法通过虚引用获得对象,用 PhantomReference 实现虚引用,虚引用的用途是在 gc 时返回一个通知。
3.如何判断对象已死(或能够被回收)
主要用到两种算法:
3.1引用计数法 :给对象中添加一个引用计数器,每当有一个地方引用它,计数器就加 1;当引用失效,计数器就减 1;任何时候计数器为 0 的对象就是不可能再被使用的。
缺点;目前主流的虚拟机中并没有选择这个算法来管理内存,其最主要的原因是它很难解决对象之间相互循环引用的问题
3.2可达性分析算法(根搜索算法):这个算法的基本思想就是通过一系列的称为 “GC Roots” 的对象作为起点,从这些节点开始向下搜索,节点所走过的路径称为引用链,当一个对象到 GC Roots 没有任何引用链相连的话,则证明此对象是不可用的。
看图方便理解:
在看总图:https://img-blog.csdnimg.cn/img_convert/9100df8b02e416f4ba90e3a17bbeb8de.png
4.垃圾回收算法的种类
主要有;①标记-清理算法
标记无用对象,然后进行清除回收。缺点:效率不高,无法清除垃圾碎片。
②复制算法
按照容量划分二个大小相等的内存区域,当一块用完的时候将活着的对象复制到另一块上,然后再把已使用的内存空间一次清理掉。缺点:内存使用率不高,只有原来的一半。
③标记-整理算法
标记无用对象,让所有存活的对象都向一端移动,然后直接清除掉端边界以外的内存。
- 标记后不是清理对象,而是将存活对象移向内存的一端。然后清除端边界外的对象。
4.分代算法
分代收集算法
分代收集算法是一种比较智能的算法,也是现在jvm使用最多的一种算法,它本身其实不是一个新的算法,而是他会在具体的场景自动选择以上三种算法进行垃圾对象回收。在jdk1.7之前,对JVM分为三个区域:新生代、老年代、永久代
①新生代
新生代的目标就是尽可能快速的收集掉那些生命周期较短的对象,一般情况下新生成的或者朝生夕亡的对象一般都是首先存放在新生代里面。
适用回收算法:复制算法
在新生代中,每次垃圾回收都有大批对象死去,只有少量存活,那就选用复制算法,只需要付出少量存活对象的复制成本就可以完成垃圾收集
②老年代
老年代一般存放的是一些生命周期较长的对象,比如在新生代中经历来了n次垃圾回收后仍然存活的对象都进入了老年代。
适用回收算法:标记整理或标记清除
在老年代中因为对象存活率较高,没有额外的空间对它分配担保,就必须使用标记清除或标记整理
③永久代
永久代主要存放静态文件,如java类,方法等,永久代对垃圾回收没有显著影响。
此文章可参考:https://blog.csdn.net/zhangxing52077/article/details/87930248