如何判断需要回收
引用记数法
每一个对象设置一个计数器,有引用则加一,没有引用则减一,为0代表没有引用
优缺点
优点:实现简单
缺点:无法解决对象直接循环引用的问题
可达性分析算法<font color="#e74f4c"><b>(Jvm使用)</b></font>
每个对象都会分析一下谁在引用它,一层一层往上分析,如果说有方法区的局部变量,或者类的静态变量引用,则存在GC ROOTs引用则不能回收,(类的示例不是GC ROOTs)<br>
GC ROOTs种类
jvm虚拟机栈引用的对象
本地方法栈引用的对象
方法区中的类静态变量引用的对象对象
方法区中的常量引用的对象
垃圾回收过程
对象在eden园区诞生,当eden区没有足够的空间时发生MinorGC<br>
MinorGC后腾出来的空间还不足以容纳大对象,则直接进入老年代,可以用参数设置大对象直接进入老年代<br>
平常只用eden和一块survivor区,当一次minorGC时,survivor中的对象复制到另一块survivor中,同时年龄<br>加一,当达到设置的年龄时进入老年代<br>
动态年龄判定:占survivor中一半以上年龄相等的对象可以直接进入老年代
发生MinorGC时会先检查老年代最大可用连续空间是否大于新生代所有对象总空间:<br> 如果大于:说明MinorGC安全,<br> 如果小于:<br> 判断是否允许担保失败:<br> 允许:判断老年代最大连续可用空间是否大于历次晋升到老年代对象的平均大小,如果大于则尝试MinorGC,否则FullGC<br> 不允许:触发FullGC
java中的各种引用
强引用
一个变量引用一个对象,只要是强引用类型的,垃圾回收绝对不会回收这个对象<br>
软引用
softReference
正常情况下不会回收该对象,但是如果进行垃圾回收,空间不足够用,哪怕有对象引用也会进行回收
弱引用
WeakReference
发生垃圾回收时候就会回收