垃圾回收

怎么判断对象为垃圾对象 refer to this doc

  • 引用计数法
    对于对象A来说,只要有其他对象引用了A 他的引用就会+1
    当A的引用计数值为0时即为垃圾对象。
    缺点!!当有互相引用的情况时,按照引用计数法永不会被回收 eg: A对象中有一个B类型的属性, B对象中有一个A类型的属性。所以当创建A,B时 他们形成了互相引用的关系。如果将这两个对象赋值为空,但他们的对象之间互相引用的关系还存在。


    图片发自简书App
  • 可达性分析 由于上述方法并不能解决互相引用,所以有了可达性分析

我们将一些重要对象作为GC root。从GCroot出发不能到达的对象就会被标记为垃圾对象。
那么GCroot有哪些呢?类变量 方法中的局部变量 常量

那么已经知道了某些对象是垃圾对象我们应该怎么回收他呢?
标记清除 容易造成碎片
复制算法:将内存空间一共分为两块 垃圾回收时 将有用的复制到另一边。其余的清除
缺点 浪费空间 所以有一种优化后的复制
内存空间分为3块 一块叫eden占百分之80两块survivor占百分之10
每次都只使用一块survivor区和eden区。当垃圾回收来临时 将eden区和其中一块在使用的survivor区中非垃圾对象一定到未使用的survivor区中。 将其他垃圾对象清楚。 然后将现在有对象的survivor区激活。
标记整理
有用的复制到另一端。从开始到另一端之间的清楚。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容