一.什么样的需要回收
1.计数法:循环引用的问题不好解决
2.根搜索算法,根节点无法触达的对象,将被回收
- 栈:
虚拟机栈帧中的引用
本地方法栈中的引用
- 本地方法区
类中的静态变量引用
常量引用
二.什么时间回收
回收的时候需要Stop the world,防止引用关系发生变化。
安全点:正在运行着的线程,需要到达某一个安全点,才能stop the world,主要包括方法调用,异常处理和循环结束等,现在虚拟机大都通过主动中断的方式,向运行着的线程发送消息,使其阻塞在安全点;如果进程没有到安全点,则走到下一个安全点被挂起
安全区域:没有正在执行的线程,停在某个程序段,使得对象的引用关系不会发生变化。从而stop the world的时候进行标记
三.怎么回收
标记清除、标记整理、复制算法。
新生代基本使用复制算法,老年带使用标记清除或者标记整理算法;具体用什么算法与具体的垃圾回收器有关

1.Serial New 新生代,复制算法,单线程的,不用线程切换,效率还可以
2.ParNew 新生代,复制算法,多线程的,能用CMS
3. Parallel Scavage 新生代,复制算法,多线程的,追求吞吐量(用户线程工作时间 / 总时间 ),可以配置吞吐量
4. SerialOld 老年代,标记整理算法,单线程,是CMS失败的时候的备用
5 paralel Old 老年贷,标记整理算法,吞吐量优先
6 CMS(Concurrent Mark Sweep) 老年代,标记清除算法,追求吞吐量
四个过程: 出始标记 -----> 并发标记 (不stop the world)------> 重新标记 -----> 并发清除
重新标记是为了找到并发标记时新产生的垃圾
三个缺点:1.CPU数量敏感,默认(cpu个数 + 3)/ 4 个线程收集垃圾
2. 产生浮动垃圾,因为没stop the world
3. 标记整理,内存碎片,当没有足够连续空间时,整理,可以配什么时候整理。
7 G1(Garbage First):自定义每次垃圾回收的时间,有一个公式,计算出所用时间和能回收空间的权值,在配置的时间内,回收认为最优的空间。
四个过程: 出始标记 -----> 并发标记 (不stop the world)------> 重新标记 -----> 筛选清除
网友评论