CPU、内存打满排查流程、JVM调优

一、top命令

  • top   //每隔5秒显式所有进程的资源占用情况
  • top -d 2  //每隔2秒显式所有进程的资源占用情况
  • top -c  //每隔5秒显式进程的资源占用情况,并显示进程的命令行参数(默认只有进程名)
  • top -p 12345 -p 6789//每隔5秒显示pid是12345和pid是6789的两个进程的资源占用情况
  • top -d 2 -c -p 123456 //每隔2秒显示pid是12345的进程的资源使用情况,并显式该进程启动的命令行参数

二、CPU打满问题排查

  1. 查找进程id: top 
  2. 查找进程中耗cpu比较高的线程id: top -p pid -H (top -Hp pid)
  3. 线程id十进制转十六进制: printf %x 线程id 
  4. 通过栈信息定位具体代码: jstack pid | grep -A 20  线程id

三、内存打满问题排查

  1. 查找进程id:top -d 2 -c
  2. 查看JVM堆内存分配情况:jmap -heap pid
  3. 查看占用内存比较多的对象 jmap -histo pid | head -n 100 ,查看占用内存比较多的存活对象 jmap -histo:live pid | head -n 100

四、JVM调优

1、性能属性

  •     吞吐量:是评价垃圾收集器能力的重要指标之一,是不考虑垃圾收集引起的停顿时间或内存消耗,垃圾收集器能支撑应用程序达到的最高性能指标。
  •     延迟:评价垃圾收集器能力的重要指标,度量标准是缩短由于垃圾收集引起的停顿时间或完全消除因垃圾收集所引起的停顿,避免应用程序运行时发生抖动。
  •     内存占用: 垃圾收集器流畅运行所需要的内存数量……

2、原则

  •      MinorGC尽可能多的收集垃圾对象。我们把这个称作MinorGC原则,遵守这一原则可以降低应用程序FullGC 的发生频率。FullGC 较耗时,是应用程序无法达到延迟要求或吞吐量的罪魁祸首。
  •     处理吞吐量和延迟问题时,垃圾处理器能使用的内存越大,即java堆空间越大垃圾收集效果越好,应用运行也越流畅。这称之为GC内存最大化原则。
  •     在这三个属性(吞吐量、延迟、内存)中选择其中两个进行jvm调优。称之为GC调优3选2。

3、堆内存

3.1、初始堆空间大小设置

    使用系统默认配置在系统稳定运行一段时间后查看记录内存使用情况:Eden、survivor0 、survivor1 、old、metaspace
    按照通用法则通过gc信息分配调整大小,整个堆大小是Full GC后老年代空间占用大小的3-4倍

  •     老年代大小为Full GC后老年代空间占用大小的2-3倍
  •     新生代大小为Full GC后老年代空间占用大小的1-1.5倍
  •     元数据空间大小为Full GC后元数据空间占用大小的1.2-15.倍
  •     按照这个通用法则先粗略调整各个内存大小……
  •     活跃数大小是应用程序运行在稳定态时,长期存活的对象在java堆中占用的空间大小。也就是在应用趋于稳太时FullGC之后Java堆中存活对象占用空间大小。(注意在jdk8中将jdk7中的永久代改为元数据区,metaspace 使用的物理内存,不占用堆内存)

3.2、堆大小调整的着手点、分析点

  •     统计Minor GC 持续时间
  •     统计Minor GC 的次数
  •     统计Full GC的最长持续时间
  •     统计最差情况下Full GC频率
  •     统计GC持续时间和频率对优化堆的大小是主要着手点,我们按照业务系统对延迟和吞吐量的需求,在按照这些分析我们可以进行各个区大小的调整……

4、年轻代

MinorGC是收集eden+from survivor 区域的,当业务系统匀速生成对象的时候如果年轻带分配内存偏小会发生频繁的MinorGC,如果分配内存过大则会导致MinorGC停顿时间过长,无法满足业务延迟性要求。所以按照堆分配空间分配之后分析gc日志,看看MinorGC的频率和停顿时间是否满足业务要求。

  • 老年代空间大小不应该小于活跃数大小1.5倍。老年代空间大小应为老年代活跃数2-3倍。
  • 新生代空间至少为java堆内存大小的10% 。新生代空间大小应为1-1.5倍的老年代活跃数。
  • 在调小年轻代空间时应保持老年代空间不变。
  • gc 配置参数: -server -Xms460M -Xmx460M -Xss512k -Xmn140M -XX:MetaspaceSize=460M -XX:MaxMetaspaceSize=256M -XX:InitialHeapSize=460M -XX:MaxHeapSize=460M -XX:NewRatio=3    堆大小无关数据省略……

5、老年代

  • 分析每次MinorGC 之后老年代空间占用变化,计算每次MinorGC之后晋升到老年代的对象大小。
  • 按照MinorGC频率和晋升老年代对象大小计算提升率即每秒钟能有多少对象晋升到老年代。
  • FullGC之后统计老年代空间被占用大小计算老年带空闲空间,再按照第2部计算的晋升率计算该老年代空闲空间多久会被填满而再次发生FullGC,同样观察FullGC 日志信息,计算FullGC频率,如果频率过高则可以增大老年代空间大小老解决,增大老年代空间大小应保持年轻代空间大小不变
  • 如果在FullGC 频率满足优化目标而停顿时间比较长的情况下可以考虑使用CMS、G1收集器。并发收集减少停顿时间
发布了170 篇原创文章 · 获赞 64 · 访问量 19万+

猜你喜欢

转载自blog.csdn.net/hy_coming/article/details/105096601
今日推荐