JVM垃圾回收

一.什么样的需要回收

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)------> 重新标记 -----> 筛选清除   

你可能感兴趣的:(JVM垃圾回收)