分代回收理论:
1 大部分对象都是朝生夕死
2 小部分对象可以熬过多次Gc
3 由于上诉情况,所以将容易回收的放到了新生代,难回收的放到了老年代
Gc的种类:
1 young gc
2 old gc
垃圾回收算法
1 复制算法:
1)新生代用的都是复制算法,但是利用率只有一半,所以引入了appel式的回收
2)将新生代分为 eden ,from ,to,每次回收时,将满足可达性的复制到from,第二次时,复制到to,同时将from的放到to,依次反复
3)eden:from:to 8:1:1
4) 由于分配担保的存在,所以不需要考虑装不下的问题
标记清除算法 mark-sweep
1 先标记再删除
2 缺点:会产生内存碎片,二次扫描效率低
标记整理算法 mark-compact
1 优点:没有内存碎片
2 缺点: 指针调整
jvm中常见的垃圾回收器
1:单线程
新生代 serial
老年嗲 serial old
2:多线程
新生代 parnew parallel scavenge
老年代 parallel old
serial/serial old
1: 单线程
2:userThread -> serial -> userThread ->serial old ->userThread
3: stw 过长
4:只适合俩百兆以内的内存回收
parallel scavenge /paralel old
1:多线程
2:吞吐量大,适合几个G的
3:stw时间不短
cms
1 初始标记:标记gcroot 可以直接关联到的对象
2 并发标记:和用户线程一起运行,时间长,对Gcroot开始关联的所有对象可达性分析
3 重新标记:标记在并发标记期间产生的垃圾
4 并发清楚:和用户线程一起运行,清楚标记的垃圾
5 缺点:cpu敏感,产生内存碎片,浮动垃圾只能下次清理
6 mark-sweep:1)可以减少stw时间,2)由于是并发,所以修改用户线程的引用的位置会导致出问题
garbage first(g1)
1:设计思想的改变,将所有空间划整为零,分成大小相同的空间,这样对stw的时间就可以预测了
2:g1 分为 eden survivor old humongous(但占用空间大于region的一半就放到这里)