JVM垃圾回收器及性能监控

一、垃圾回收算法

JVMGC的对象是堆和永久区。垃圾回收算法主要有:

1、引用计数法:通过引用和去引用的++--操作,来标记资源是否被使用,该算法有性能问题;另外无法解决垃圾对象循环用用的问题。

2、标记清除法:分为标记和清除两步。首先对于有引用的对象标记起来,然后对于没有标记的对象在GC的时候将会被清除。

3、标记压缩法:首先也是从根节点开始标记有引用的对象,然后将被引用的对象拷贝到存储空间的一端,最后再将边界以外的数据清除。

4、复制算法:他有两块大小相等的空间,可用的存活对象被复制到另一块空间中,清理原来的空间。存在一定的空间浪费,所以不适用与存活对象较多的场合

  另外,依据对象的存活周期进行分类,短命对象归为新生代,长命对象归为老年代。 根据不同代的特点,选取合适的收集算法: 少量对象存活,适合复制算法; 大量对象存活,适合标记清理或者标记压缩 

 

二、垃圾回收器

垃圾回收器主要有:串行收集器 、并行收集器 、CMS收集器等

1、串行收集器

特点:效率高 可能会产生较长的停顿 ,适用于cp数量少的场合

设置参数为:-XX:+UseSerialGC 

可作为新生代、老年代使用串行回收 

采用的算法:新生代采用复制算法, 老年代采用标记-压缩算法

该回收器在运行的过程中需要暂停应用程序,所以会造成STW问题

2、并行收集器

参数:-XX:+UseParNewGC  此时,新生代并行(复制算法) 老年代串行(标记-压缩)

参数:-XX:+UseParallelOldGC  此时老年代也是并行

GC收集器通过多线程并发GC的方式运行,具有较高的吞吐量,但同样会造成STW问题

 

3、并发收集器(CMS

该收集器是老年代的GC收集器,使用的是标记清除算法,之所以不采用标记压缩是因为,CMS运行的时候应用程序并不会产生停顿,为了保证不会停顿就不能对堆空间中的数据进行移动

参数:-XX:+UseConcMarkSweepGC,此时老年代使用CMS收集器

GC收集器的特点是:

1)尽可能降低停顿,但是会影响系统整体吞吐量和性能。比如,在用户线程运行过程中,分一半CPU去做GC,系统性能在GC阶段,反应速度就下降一半。

2)清理不彻底因为在清理阶段,用户线程还在运行,会产生新的垃圾,无法清理

3) 因为和用户线程一起运行,不能在空间快满时再清理

4)需要预留足够的空间,否则就会引起concurrent mode failure

 

三、常用JVM性能监控命令

1、常用命令说明

1top

通过top命令可以查看系统整体资源使用情况

2vmstat

该命令可以统计系统CPU、内存、IO以及上下文切换等信息

cs 表示每秒上下文切换次数,这个值要越小越好,上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用。所以当改值太大了,要考虑调低线程或者进程的数目。

该命令详细详细说明参看这里

3pidstat

a. 可以通过该命令查看某个进程中线程的信息。具体命令是:

pidstat -p 2962 -u 1 10 –t  

该命令表示查看进程号为2962的线程信息,每秒钟采样一次,共采样10

b. 该命令也可以查看某个进程的内存信息 

pidstat -r -p 1505 1 5

4jstack

通过该命令可以查看某个进程的堆栈信息

jstack 1505 > ./jstack.log

这样就可以在jstack.log中查看具体的线程状态

2、通过以上命令可以查找系统出现卡顿的原因,具体步骤是:

1)使用top命令查看系统运行情况,发现cpu占有率

2)根据现实的信息找到cpu占用率高的进程

3)使用pidstat找到该进程中哪个线程占用cpu最高

4)使用jstack导出该进程的线程信息,并根据步骤3中得到的线程id从导出信息中找到具体线程

5)根据业务分析,该线程为何cpu占用率高



网易云新用户大礼包:https://www.163yun.com/gift

本文来自网易实践者社区,经作者陈庆霆授权发布。