怎么判断对象为垃圾对象 refer to this doc
-
引用计数法
对于对象A来说,只要有其他对象引用了A 他的引用就会+1
当A的引用计数值为0时即为垃圾对象。
缺点!!当有互相引用的情况时,按照引用计数法永不会被回收 eg: A对象中有一个B类型的属性, B对象中有一个A类型的属性。所以当创建A,B时 他们形成了互相引用的关系。如果将这两个对象赋值为空,但他们的对象之间互相引用的关系还存在。
- 可达性分析 由于上述方法并不能解决互相引用,所以有了可达性分析
我们将一些重要对象作为GC root。从GCroot出发不能到达的对象就会被标记为垃圾对象。
那么GCroot有哪些呢?类变量 方法中的局部变量 常量
那么已经知道了某些对象是垃圾对象我们应该怎么回收他呢?
标记清除 容易造成碎片
复制算法:将内存空间一共分为两块 垃圾回收时 将有用的复制到另一边。其余的清除
缺点 浪费空间 所以有一种优化后的复制
内存空间分为3块 一块叫eden占百分之80两块survivor占百分之10
每次都只使用一块survivor区和eden区。当垃圾回收来临时 将eden区和其中一块在使用的survivor区中非垃圾对象一定到未使用的survivor区中。 将其他垃圾对象清楚。 然后将现在有对象的survivor区激活。
标记整理
有用的复制到另一端。从开始到另一端之间的清楚。