一、基础知识
1.根搜索算法(GC Roots Tracing)
可作为GC roots的对象:
(1)栈帧中局部变量表中引用的对象
(2)方法区中类静态变量引用的对象
(3)方法区中常量引用的对象
(4)JNI引用的对象
2.引用
分为:
(1)强引用
Object obj = new Object();只要强引用存在,永远不会被回收
(2)软引用
还有用,但并非必须的对象,在系统将要发生内存溢出异常之前回收
(3)弱引用
只能生存到下一次GC之前
(4)虚引用
无法取得对象实例
3.垃圾收集算法
(1)Eden,两个Survivor使用复制算法(copying)
HotSpot默认Eden和其中一块Survivor比例是8:1。每次使用Eden和其中一块Survivor,回收时,将这两个区存活的对象一次性拷贝到另一个survivor区中,然后清除这两个区的空间。当第二块survivor空间不够时,将对象通过分配担保机制进入老年代
(2)老年代使用标记-整理算法(mark-compact)
首先标记需要回收的对象,标记完成后统一回收,注意是统一。然后将对象向前移动,清除端边界以外的内存。
(3)标记-清除算法(mark-sweep)
现在CMS使用的算法
二、垃圾回收
1.垃圾收集器
1.1 Serial收集器
(1)单线程收集器,Client模式默认新生代收集器
(2)工作时必须暂停其他所有工作线程
优点:单个CPU情况下简单高效,专注于做垃圾收集而没有其他线程开销
缺点:不说了
1.2 ParNew收集器
(1)Serial收集器的多线程版本,Server模式下首选
(2)唯一能和老年代CMS收集器交互的收集器
(3)多CPU首选
1.3 CMS收集器
(1)并发执行
(2)标记-清除算法,碎片较多。往往被迫提前进行Full GC
1.4 G1收集器
标记-整理算法,JDK 1.6开始有
2.内存分配回收策略
2.1 对象优先在Eden区分配
当Eden没有足够空间时发起Minor GC
2.2 大对象直接进入老年代
很长的字符串和数组
2.3 长期存活的对象直接进入老年代
JVM给每个对象一个年龄计数器,在Survivor区每经过一次Minor GC存活就增加一岁,默认15岁晋级到老年代