JVM收集器CMS与G1区别和优缺点分析

本文详细介绍了线上故障排查的流程,重点关注JVM的CPU、磁盘、内存问题。通过对CPU使用率高的线程进行jstack分析,识别频繁FullGC的原因,并探讨了内存问题,尤其是堆内内存的OOM分析,包括堆外内存的排查。文章还涉及了JVM收集器CMS与G1的优缺点分析,帮助读者理解如何进行JVM性能优化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

【JVM性能优化】问题故障排查的解决方案(上)

前提概要

线上故障主要会包括cpu、磁盘、内存以及网络问题,而大多数故障可能会包含不止一个层面的问题,所以进行排查时候尽量四个方面依次排查一遍。同时例如jstack、jmap等工具也是不囿于一个方面的问题的,基本上出问题就是df、free、top三连,然后依次jstack、jmap伺候,具体问题具体分析即可

CPU的问题

一般来讲我们首先会排查cpu方面的问题。cpu异常往往还是比较好定位的。原因包括业务逻辑问题(死循环)、频繁gc以及上下文切换过多。而最常见的往往是业务逻辑(或者框架逻辑)导致的,可以使用jstack来分析对应的堆栈情况

jstack分析cpu问题

  1. 先用ps命令找到对应进程的pid(如果你有好几个目标进程,可以先用top看一下哪个占用比较高),来找到cpu使用率比较高的一些线程

top -H -p pid

这里需要注意的是 -p代表着通过进程号,-H 查询的是输出使用率最高线程

image.png

  1. 将占用最高的pid转换为16进制得到nid

printf ‘%x\n’ pid

image.png

  1. 接着直接在jstack中找到相应的堆栈信息

jstack ‘0x42’ | grep ‘nid’ -C5 –color

可以看到我们已经找到了nid为0x42的堆栈信息,接着只要仔细分析一番即可。

image.png

  1. 排查整个jstack文件
  • 当然更常见的是我们对整个jstack文件进行分析,通常我们会比较关注WAITING和TIMED_WAITING的部分,BLOCKED就不用说了。
  • 使用命令cat jstack.log | grep "java.lang.Thread.State" | sort -nr | uniq -c来对jstack的状态有一个整体的把握,如果WAITING之类的特别多,那么多半是有问题啦。

image.png

JVM频繁gc(FullGC)

使用jstack来分析问题,但有时候我们可以先确定下gc是不是太频繁,使用jstat -gc pid 1000命令来对gc分代变化情况进行观察,1000表示采样间隔(ms)。

  • S0C/S1C、S0U/S1U、EC/EU、OC/OU、MC/MU分别代表两个Survivor区、Eden区、老年代、元数据区的容量和使用量。
  • YGC/YGT、FGC/FGCT、GCT则代表YoungGc、FullGc的耗时和次数以及总耗时。
### JVMCMS G1 垃圾回收器的优缺点对比 #### 优点缺点分析 #### CMS (Concurrent Mark Sweep) 收集器 ##### 优点: - **低延迟特性**:CMS 是一种以最短暂停时间为设计目标的垃圾收集器,能够满足大多数交互式应用场景的需求[^3]。 - **并发清理能力**:大部分工作可以在后台线程中完成,减少了主线程被阻塞的时间。这使得它非常适合对响应时间敏感的应用程序。 ##### 缺点: - **高 CPU 开销**:由于需要运行多个辅助线程来进行标记清扫操作,因此会对系统的整体性能造成一定影响。 - **无法处理浮动垃圾**:如果在并发阶段产生的新垃圾过多,则可能导致“并发模式失败”,此时不得不退化为 Serial Old 进行完全 STW 的 Full GC。 - **空间碎片问题严重**:因为采用的是标记清除算法,容易产生大量不连续的空间分布,最终可能引发分配担保失败等问题。 #### G1 (Garbage First) 收集器 ##### 优点: - **可预测性更强**:通过分区技术以及混合收集策略实现了更加稳定可控的大规模内存管理方案[^1]。 - **支持大容量堆内存环境下的高效运作**:特别针对具有超大数据量的企业级业务场景进行了优化调整,在超过特定临界点之后表现尤为突出(通常认为该转折区间位于约6~8 GB范围内)。 - **自动整理内存结构**:除了常规意义上的对象释放外还会动态重组内部区域布局,从而缓解因长期累积所造成的零散区块现象发生几率下降明显[^2]。 ##### 缺点: - **初始配置复杂度较高**:相比其他几种传统类型的GC方式而言,初次接触者可能会觉得参数设定过程较为繁琐难以掌握最佳实践指南。 - **对于小型应用不够经济实惠**:当可用资源总量处于较低水平时(如小于上述提到的标准界限值之下),选用此选项未必能带来预期收益反而增加额外负担。 ```java // 启动JVM时指定使用G1垃圾回收器 java -XX:+UseG1GC MyApplication // 或者启用CMS垃圾回收器 java -XX:+UseConcMarkSweepGC MyApplication ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值