JVM垃圾回收

垃圾收集器主要分为两步:

1、查找不再使用的对象

2、释放这些对象管理的内存

那么垃圾收集器怎么查找到不再使用的对象呢?

虚拟机判断一个对象是否存活用的是:根除法或者叫根搜索算法。

这个算法的思路其实很简单,它把内存中的每一个对象都看作一个节点,并且定义了一些对象作为根节点“GC Roots”。如果一个对象中有另一个对象的引用,那么就认为第一个对象有一条指向第二个对象的边,如下图所示。JVM会起一个线程从所有的GC Roots开始往下遍历,当遍历完之后如果发现有一些对象不可到达,那么就认为这些对象已经没有用了,需要被回收。

JVM垃圾回收

                                                                                  根搜索算法图解(借图)

那么问题来了,哪些对象可以作为根除法的根呢?

其中有四种作为GC Roots的对象。

       a、首先第一种是虚拟机栈中的引用的对象,我们在程序中正常创建一个对象,对象会在堆上开辟一块空间,同时会将这块空间的地址作为引用保存到虚拟机栈中,如果对象生命周期结束了,那么引用就会从虚拟机栈中出栈,因此如果在虚拟机栈中有引用,就说明这个对象还是有用的,这种情况是最常见的。

       b、第二种是我们在类中定义了全局的静态的对象,也就是使用了static关键字,由于虚拟机栈是线程私有的,所以这种对象的引用会保存在共有的方法区中,显然将方法区中的静态引用作为GC Roots是必须的。

       c、第三种便是常量引用,就是使用了static final关键字,由于这种引用初始化之后不会修改,所以方法区常量池里的引用的对象也应该作为GC Roots。

       d、最后一种是在使用JNI技术时,有时候单纯的Java代码并不能满足我们的需求,我们可能需要在Java中调用C或C++的代码,因此会使用native方法,JVM内存中专门有一块本地方法栈,用来保存这些对象的引用,所以本地方法栈中引用的对象也会被作为GC Roots。

好,如何查找不再使用的对象我们就说到这里,接下来讨论下第二块,那么虚拟机怎么释放内存呢?

主流的垃圾收集器有:serial收集器(常用于单cpu)、ThroughPut收集器、ConCurrent收集器(CMS)、G1

CMS是一款优秀的收集器

1、以获取最短回收停顿时间为目标的收集器。

2、非常符合互联网网站或者B/S系统的服务器上,重视服务的响应速度,系统系统停顿时间最短的引用。

3、基于“标记-清除”算法实现

4、CMS收集器的内存回收过程与用户线程一起并发执行

5、他的运行过程分为4个步骤,包括:

            a、初始标记,“Stop The World”,只是标记一下GC Roots能直接关联到的对象,速度很快。

            b、并发标记,并发标记阶段就是进行GC RootsTracing的过程

            c、重新标记,“Stop The World”,是为了修正并发标记期间因用户程序继续运作而导致标记产生变动的那一部分对象的标记记录,但远比并发标记时间短。

            d、并发清除。

6、优点:并发收集、低停顿

7、缺点:

               对CPU资源非常敏感

               无法处理浮动垃圾,可能出现Concurrent Mode Failure失败而导致另一次Full GC的产生。

G1(Garbage-First)收集器

1、当今收集器技术发展的最前沿成果之一。

2、G1是一款面向服务端应用的垃圾收集器。

3、优点:

           并行与并发:充分利用多CPU,多核环境下的硬件优势。

           分代收集:不需要其他收集器配合就能独立管理整个GC堆

           空间整合:“标记-整理”算法实现的收集器,局部上基于“复制”算法不会产生内存空间碎片

           可预测的停顿:能让使用者明确指定了一个长度为M毫秒的时间片段内,消耗在垃圾收集器上的时间不得超过N毫秒

4、G1收集器运作大致可划分为以下几个步骤:

           初始标记:标记一下GC Roots能直接关联到的对象,需要停顿线程,但耗时很短

          并发标记:从GC Roots开始对堆中对象进行可达性分析,找出存活的对象,这阶段耗时较长,但可与用户程序并发进行。

           最终标记:修正在并发标记期间因用户程序继续运作而导致标记产生变动的那一部分标记记录

          筛选回收:对各个Region的回收价值和成本进行排序,根据用户所期望的GC停顿时间来制定回收计划。