《java performane》第四章读书笔记

        第四章----- java performance monitoring

 

一, 垃圾回收机制

           1,监控点:1)使用的垃圾回收策略

                       2)JAVA HEAP大小

                       3)年轻代与年老代,持久带空间大小

                       4)minor GC 与 full GC 回收持续时间,频率,回收内存数量

                       5)一个 concurrent GC 周期回收空间数量

                        6)垃圾回收前后,堆内存使用占比

                        7)年轻代,年老代,在垃圾回收前后使用占比

                       8)触发FULL GC 的原因,是否是年老代或持久代占比过高引起的。

                       9)是否应用显式调用了System.gc()

            2,参数

                      -XX:+ScavengeBeforeFullGC  默认值,+表示full GC时,先回收年轻代,再回收年老代。

            3,垃圾收集器分类

                    主要根据应用的不同类型分为响应优先型及吞吐量优先型。

              并行收集器:-XX:+useParalleGC 使用多个线程做年轻代GC,单个线程做年老代GC

                                -XX:+useParalleOldGC 使用多个线程做年老代GC。

              并发收集器:-XX:+useConcMarkSweepGC 优先保证程序响应性,将垃圾回收与程序尽量并行执行,减少停顿时间。

              串行收集器一般用在单CPU的场合,目前来看已经用得很少了。

              增量收集器已经被1.4.2废弃。

            4,并发收集器原理(CMS)

             Cms的全名,concurrent mark-sweep collector.我们知道jvm垃圾回收的算法大致可以分为串行算法(serial collector),并行算法(parallel collector) 和并发算法(concurrent collector).cms 算法属于并发算法,因为对应用程序的影响小,因此也被称为低延迟回收器(low latency collector)。

            Cms在处理young generation的垃圾回收时采用的算法和parallel collector是一样的,利用多硬件多cpu的特点。这里稍微提下parallel和concurrent的区别,事实上concurrent微观上还是串行的,只不过是在多个线程之间进行调度;parallel的在微观上还是并行的,多个任务在不同的cpu上各自运行。

废话不多说,我们接下来看下cms算法在处理young generation垃圾回收时的具体做法:

本质上来说,这种算法是对串行算法的优化,但是它依然是需要freeze掉应用程序的,也就是我们说的,停止整个世界(stop the world and copy).利用多cpu的特点,降低GC损耗,也因此提高了应用的吞吐量。

            Cms与其它算法比较起来优势体现在对old generation进行垃圾回收效率: 

            一个cms回收周期以一个短暂停开始,称之为初始标记(initial mark),在这个阶段算法会确认初始的能直接从应用代码中可触及的存活对象集合;然后在并发标记阶段,回收器标记所有从初始标记阶段对象集合中传递可及的对象。因为这个阶段过程中,应用程序还在运行,因此不能保证所有存活的对象都被标记了,为了解决这个问题,第三个阶段被引入了,我们称之为重新标记(remark);它通过访问所有在并发标记阶段改变了的对象来完成最终标记。因为这个过程中freeze应用程序的时间比初始标记的时间更长,因此多个线程会并行(parallel)来处理以提高效率。这样就可以保证所有存活的对象都被标记了。因此接下来的清扫阶段(sweep),所有被确认的垃圾都被回收了。注意,在intial mark和remark阶段,应用程序和serial collector一样,freeze了应用程序。在remark过程中,由于增加了回收器的工作了,所以事实上增加了开销,但是我们却能让暂停时间减少,这是一种权衡。

我们需要知道的cms的缺点

1)Cms回收器是唯一不做压缩(compact)的算法

这样节省了时间,但是由于空闲内存区域不连续,回收器不能用一个简单的指针来指出下一个能把对象分配的空闲区域。取而代之,它使用一定数目的list连接成一片未分配的内存区域,每次一个对象要被分配,它将在合适的list(根据需要的内存多少)中找出一个足够大的区域来存储对象。结果,old generation的内存分配比简单的增加指针技术更昂贵。这同时也要给young generation垃圾回收带来了额外的开销,因为大部分情况下old generation需要分配内存是因为young generation在进行垃圾回收。

2)Cms的另外一个缺点在于比需要比其它回收器更大的堆大小。考虑到在标记阶段应用还允许运行,分配内存还在继续,因此old generation会继续增长。此外,尽管回收器保证在标记阶段确认所有存活的对象,有些对象在那个阶段仍然可能变成垃圾,那么他们就只能等到下次old generation进行垃圾回收的时候才能被回收。这些对象被称为“漂浮垃圾”(floating garbage).最后由于缺少压缩,碎片容易产生,为了处理碎片,cms回收器记录常。见的对象大小,预计未来需求,然后分割或者链接空闲区域来满足需求。

灵活的机制

     不像其它的回收器,cms回收器不会等到old generation满了才去回收垃圾,而是在old generation满了以前就开始垃圾回收。可是如果old generation真的满了,cms恢复成并行和串行回收器使用的更消耗时间的停止世界(stop the world) mark-sweep-compact算法。当然cms会尽量避免出现这种情况,它采取一种策略,根据以前的回收耗费时间以及多快old generation 被填满的统计数据决定何时启动垃圾回收。同时如果old generation 的使用率超过一个被称为initiating occupancy的值后,它会启动一次垃圾回收。这个值可以通过命令行选项 –XX:CMSInitiatingOccupancyFraction=n,来设置。n是old generation的使用率。默认值是68.

总之,相比并行回收器,cms回收器降低了old generation的停滞时间,有时候会极大的降低,代价就是young generation 的pause会稍微长一些,同时吞吐量有些下降,需要更大一些的堆。

何时使用cms回收器?

    如果你的应用需要更短的垃圾回收暂停时间同时能承担垃圾回收和应用程序分享处理器资源,那么就使用cms回收器吧。如果你的机器有多个处理器,这个算法带来的好处会更多,所以它对web 服务器和交互应用尤其合适。

选择cms算法

    如果你想应用cms算法,你必须显示的在命令行中指明选项-XX:+UseConcMarkSweepGC,如果你想让它在增量模式下运行,依然可以通过选项–XX:+CMSIncrementalMode 选项来做到。

解释下full GC

    当old 或者permanent generation填满,full GC(有时候我们称之为major GC)就会被触发,也就是所有的generation都被回收了。通常,young generation首先被回收,使用为那个generation设计的算法进行回收,因为通常这都是young generation 最有效的算法。而old generation回收器的算法则被应用到perm和old generation上。如果压缩(compact)发生,每个代都各自被压缩。如果old generation太满以至于无法接收从young generation过来的对象,除了cms回收器以外,young generation 的垃圾回收算法不会运行,old generation的算法会应用到整个堆。(当然old generation 的cms算法是个例外,因为它不能去回收young generation).

  

二,class loader --- 持久代垃圾回收

        当在FULL GC 时发现有unload class 发生,则说明Perm 区已经不足,那么需要增大 -XX:PermSize 和 -XX:MaxPermSize 。在CMS方式下,并行回收Perm 区,是不会发生STOP-THE-WORLD的。可以放心开启Perm区的垃圾回收。

 

三,JStack 发现锁

       如果用JStack发现,相当多数量的线程都在等待同一个锁(同一个锁地址,waiting to lock<0x XXXXX>),则说明该多并发系统可能的瓶颈在于此。

                      

 

            

你可能感兴趣的:(java,cms,GC,performance)