gc 相关简单记录
GC相关一些记录:
Garbage Collection 垃圾收集了解GC 需要弄清楚三个问题:
- 回收些什么?
- 什么情况下回收?
- 如何回收
Java 中的引用类型
- 强引用,一般来说直接新建的对象,只要引用还存在就不会被回收
- 软引用
SoftReference
,内存不足时清理,All soft references to softly-reachable objects are guaranteed to have been cleared before the virtual machine throws anOutOfMemoryError
- 弱引用
WeakReference
,存活到下次GC,直接回收 - 虚引用
PhantomReference
,一个对象是否有虚引用的存在,不会对其生存时间产生影响,也无法通过虚引用取得一个对象的引用,它存在的唯一目的是在这个对象被回收时可以收到一个系统通知
如何判断
- 引用计数法
有对这个对象的引用就+1,不再引用就-1,但是这种方式看起来简单美好,但它却不能解决循环引用计数的问题。因此可达性分析算法登上历史舞台,用它来判断对象的引用是否存在 - 可达性算法
通过一系列称为 GCRoots 的对象作为起始点,从这些节点从上向下搜索,所走过的路径称为引用链,当一个对象没有任何引用链与GCRoots连接时就说明此对象不可用,也就是对象不可达
GC Roots 对象通常包括:
- 虚拟机栈中引用的对象(栈帧中的本地变量表)
- 方法中类的静态属性引用的对象
- 方法区中常量引用的对象
- Native 方法引用的对象