JAVA性能权威指南之GC

简单来说,垃圾收集由两个部分组成:查找不使用的对象,以及释放这些对象所关联的内存。

                            --------JAVA性能权威指南

内存垃圾判定算法:

root引用链分析,因为计数法无法解决循环引用的问题。

 

内存分区:

在JVM(JDK1.7)中,将堆内存划分为新生代、老年代以及永久代。分别对这些区域进行垃圾回收,这样就避免了整堆扫描以及回收,减少了停顿时间。

  新生代:

由于内存分配总是从新生代开始,在新生代填满时,垃圾回收器会暂停所有的应用线程,回收新生代空间。不再使用的对象会被回收,仍然在使用的对象会被

移动到其他地方,这个过程称之为Minor GC。

  老年代:

存活的对象会被移动到老年代,最终当老年代被填满时,JVM需要找出老年代中,不在使用的对象并对它们进行回收,这个过程称之为Full GC,并且这个过程中通常导致应用程序长时间的停顿。

  永久代:

用于存放类信息,符号引用等信息。一般不进行回收,一般情况下当类加载器泄漏的时候,有可能会造成永久代内存升高。

  CMS收集器

CMS的三种基本操作:

1. 会对新生代的对象进行回收(所有的应用线程都会被暂停)。

在这个过程中,对象从Eden区域中被移动到了Survivor空间中,如果是大对象直接会被移动到老年代中(因为空间担保的策略,Eden区的存活对象进入Survivor区时,会利用老年代剩余空间进行担保,如果survivor区的内存不够时,会将存活对象直接进入老年代;如果空间担保失败,那么JVM就会发起Full GC)。其GC日志如下:

89.853 [GC 89.853:[ParNew : 629120K -> 69888K(629120K),0.1218790 secs] --> 括号中的是新生代的大小,箭头后面的是目前(垃圾回收后)占用的内存

          1303940K -> 772142K(2027264K),0.1220090 secs] --> 括号黄中的是整个堆的大小,箭头后面的是目前(也就是垃圾回收后)占用的内存

          [Times : user = 0.42 sys = 0.02,real = 0.12 secs] user代表的是GC线程所使用的CPU时间,real指的是垃圾回收过程(垃圾清理时间)

2. 会启动一个并发的线程对老年代进行回收。

JVM会根据堆使用的情况启动并发回收。

并发回收分成如下阶段:

(1)初始标记。此阶段会暂停所有的应用程序线程,同时找到堆中所有的垃圾回收根节点对象。GC日志中显示这一阶段开始的标识符是 CMS-initial-mark

(2)标记阶段。这个阶段是并发进行,所以应用程序线程可以持续运行。GC日志中这一阶段的标识符是 CMS-concurrent-mark-start

(3)预清理阶段。这个阶段也是并发进行的,应用程序线程不必停止。而这个阶段将分为几个步骤:

  (a)可中断预清理。(作用是避免连续的停顿操作。因为remark阶段是停顿的,如果新生代收集刚结束,紧接着就是重新标记,会导致发生两次停顿)

  (b)rescan

  (c)weak refs processing(处理弱引用)

  (d)scrub string table

  (e)CMS-remark (重新标记)

(4)清除阶段。该阶段是与应用程序并发进行的,其GC标识符是CMS-concurrent-sweep,此阶段与新生代的收集可以并发进行。

(5)重置节点。该阶段是与应用程序并发进行的,其GC标识符是CMS-concurrent-reset。

并发模式失效:(1)也就是当新生代进行垃圾回收时,老年代没有足够的内存容纳晋升的对象(空间担保失败),CMS垃圾回收就会退化成Full GC,此时所有的应用线程就会被暂停。(2)老年代有足够的空间进行空间担保策略,但是由于空闲空间的碎片化,导致晋升失败。

针对并发模式失败的调优:

(1)更高频率的进行垃圾回收。 调整老年代占用率,比如当超过50时,就开始进行并发回收。

(2)使用更多的后台线程。如果发生并发模式失败,同时又有额外的CPU时间可用,增加后台线程数,

3. 如果有必要,CMS会发起Full GC。

 

  G1回收器

总体概述:G1是一种工作在堆内不同分区上的并发收集器,同一个代的分区(region可以归属于老年代,也可以归属于新生代,在默认情况下,一个堆被分成2048个分区,)不要保持连续,G1的目的就是针对超大堆的垃圾回收而设计的。当然整个新生代在进行垃圾回收时,整个新生代要么被回收要么被晋升,G1在新生代也采取分区机制的部分原因是采用预定义的分区能够便于代的大小调整。

G1的收集活动主要包括4种操作:

(1)新生代垃圾收集

新生代的垃圾回收发生在Eden区耗尽时。

(2)后台收集,并发周期

并发周期分为如下三个阶段:

(a)初始标记

在此阶段,会对新生代进行清理,将Eden区域中的垃圾进行回收或者进入Survivor区。这个阶段要对新生代进行清理,所以G1直接复用新生代清理阶段同时加上了标记

(b)并发标记

并发标记阶段仅仅是针对老年代做一个标记,对老年代哪些地方有垃圾,老年代哪些地方垃圾最多做判定。需要指出的是,在并发标记周期中,对新生代至少进行一次垃圾回收操作。

(c)清理

(3)混合式垃圾收集

混合垃圾回收是将并发周期中标记阶段内所标记的垃圾部分进行回收,当所标记的垃圾被回收完成之后,混合垃圾回收阶段结束。

(4)必要时的Full GC

一半来讲就是混合回收失败时,有可能会触发Full GC。

调优方式:

(1)增加线程数

(2)增加回收的频率

 

 

 

贴一个G1垃圾回收写的有深度的博客https://blog.csdn.net/coderlius/article/details/79272773

posted @ 2019-12-15 19:59  知事  阅读(183)  评论(0编辑  收藏  举报