一、垃圾回收算法
JVM中GC的对象是堆和永久区。垃圾回收算法主要有:
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、常用命令说明
(1)top
通过top命令可以查看系统整体资源使用情况
(2)vmstat
该命令可以统计系统CPU、内存、IO以及上下文切换等信息
cs 表示每秒上下文切换次数,这个值要越小越好,上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用。所以当改值太大了,要考虑调低线程或者进程的数目。
该命令详细详细说明参看这里。
(3)pidstat
a. 可以通过该命令查看某个进程中线程的信息。具体命令是:
pidstat -p 2962 -u 1 10 –t
该命令表示查看进程号为2962的线程信息,每秒钟采样一次,共采样10次
b. 该命令也可以查看某个进程的内存信息
pidstat -r -p 1505 1 5
(4)jstack
通过该命令可以查看某个进程的堆栈信息
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
本文来自网易实践者社区,经作者陈庆霆授权发布。