判断对象的存活
引用计数法
给对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器减 1。引用计数为 0 的对象可被回收。(Python 在用,但主流虚拟
机没有使用)
优点:快,方便,实现简单。
缺陷:对象相互引用时(A.instance=B 同时 B.instance=A),很难判断对象是否该回收。
可达性分析(Java 中使用)
(面试时重要的知识点,牢记)
判定对象是否存活。这个算法的基本思路就是通过一系列的称为“GC Roots”的对象作为起始点,从这些节点开始向下搜索,搜索所走过的路径称为
引用链(Reference Chain),当一个对象到 GC Roots 没有任何引用链相连时,则证明此对象是不可用的。
作为 GC Roots 的对象包括下面几种:
1.当前虚拟机栈中局部变量表中的引用的对象
2.当前本地方法栈中局部变量表中的引用的对象
3.方法区中类静态属性引用的对象
4.方法区中的常量引用的对象
各种引用(Reference)
强引用
一般的 Object obj = new Object() ,就属于强引用。
(如果有 GCroots 的强引用)垃圾回收器绝对不会回收它,当内存不足时宁愿抛出 OOM 错误,使得程序异常停止,也不会回收强引用对象。
软引用 SoftReference
垃圾回收器在内存充足的时候不会回收它,而在内存不足时会回收它
软引用非常适合于创建缓存。当系统内存不足的时候,缓存中的内容是可以被释放的。
弱引用 WeakReference
垃圾回收器在扫描到该对象时,无论内存充足与否,都会回收该对象的内存。
虚引用 PhantomReference
幽灵引用,最弱,被垃圾回收的时候收到一个通知
GC(Garbage Collection)
jvm参数设置
-Xms 堆区内存初始内存分配的大小
-Xmx 堆区内存可被分配的最大上限
-XX:+PrintGCDetails
打印 GC 详情
-XX:+HeapDumpOnOutOfMemoryError
Minor GC
特点: 发生在新生代上,发生的较频繁,执行速度较快
触发条件: Eden 区空间不足\空间分配担保
Full GC
特点:主要发生在老年代上(新生代也会回收),较少发生,执行速度较慢
触发条件:
调用 System.gc()
老年代区域空间不足
空间分配担保失败
JDK 1.7 及以前的永久代(方法区)空间不足
CMS GC 处理浮动垃圾时,如果新生代空间不足,则采用空间分配担保机制,如果老年代空间不足,则触发 Full GC