技术总结一期-10-jvm调优&内存溢出排查思路&cpu升高排查思路

【README】

本文总结自《黑马程序员视频教程》,墙裂推荐;

本文内容包括:

  1. jvm调优
  2. jvm调优工具
  3. oom排查思路及方法;
  4. CPU使用率升高排查思路;

【1】jvm调优参数设置

  1. war包部署在tomcat中设置;
    •  修改 TOMCAT_HOME/bin/catalina.sh 文件;
      1.  JAVA_OPS=”-Xms512m -Xmx1024m
  2. jar包部署在启动参数设置:启动springboot项目:
    • nohup java -Xms512m -Xmx1024m -jar xxx.jar --spring.profiles.active=prod &
      1. Nohup: 用于在系统后端不挂断的运行命令,退出终端不会影响程序运行;
      2. 参数&:让命令在后台执行,终端退出后命令仍旧执行;

【2】jvm调优参数有哪些?

  1. Jvm调优参数列表
    • 设置堆空间大小;
    • 虚拟机栈的设置;
    • 年轻代中eden区和两个survivor区的大小比例;
    • 年轻代晋升老年代阈值;
    • 设置垃圾收回器;

补充:jvm调优参数参考官方文档:

va HotSpot VM Options】icon-default.png?t=N7T8https://www.oracle.com/java/technologies/javase/vmoptions-jsp.html

  1. 设置堆空间:
    • 参数(单位默认为字节):
      1. -Xms:1024m:设置堆初始化值;
      2. -Xmx:2g:设置堆最大内存;
    • 堆空间设置为多少合适
      1. 最大值设置为物理内存的1/4; 初始大小为 1/64;
      2. 堆太小,可能导致频繁回收,产生stw,暂停用户线程;
      3. 堆太大,存在风险;发生fullgc时,扫描整个堆空间,导致stw耗时长,暂停用户线程时间长;
  2. 虚拟机栈设置:
    • 每个线程默认开启1M内存,用于存放栈帧(调用参数,局部变量等); 一般设置为256k;
    • 减少每个线程堆栈,可以产生更多线程;
    • 参数:-Xss128k: 对每个线程stack的调整;
  3. 年轻代中eden区和两个Survivor的比例设置:
    • -XXSurvivorRatio=8  表示年轻代中survivor:eden=2:8
  4. 年轻代晋升为老年代阈值:
    • -XX:MaxTenuringThreshold=threshold
    • 默认为15,取值范围1~15
  5. 设置垃圾回收器:
    • -XX:+UseParallelGC
    • -XX:+UseParallelOldGC
    • -XX:+UseG1GC

【3】jvm调优工具

  1. 命令工具:
    • jps:查看正在运行的进程息;
    • jstack:查看java进程内线程堆栈信息;
    • jmap:查看堆转信息;
    • jhat:堆转储快照分析工具;
    • jstat:jvm统计检测工具 ;
  2. 可视化工具:
    • jconsole: 用于对jvm的内存,线程,类的监控;  
    • VisualVM: 能够监控线程,内存情况;

【3.1】命令工具

【3.1.1】jps-查看正在运行的进程

D:\workbench_idea\java8test>jps
16864
8664 JpsCommandDemo
18348 Jps
18732 Launcher

【3.1.2】jstack-查看进程内线程信息

D:\workbench_idea\java8test>jstack 8664
2023-09-02 11:30:48
Full thread dump Java HotSpot(TM) 64-Bit Server VM (25.172-b11 mixed mode):
.................................

【3.1.3】 jmap-生成堆转内存快照,内存使用情况

1) jmap  -heap pid 查看堆转内存快照

D:\workbench_idea\java8test>jmap -heap 8664
Attaching to process ID 8664, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.172-b11

using thread-local object allocation.
Parallel GC with 8 thread(s)

Heap Configuration:
   MinHeapFreeRatio         = 0
   MaxHeapFreeRatio         = 100
   MaxHeapSize              = 4253024256 (4056.0MB)
   NewSize                  = 88604672 (84.5MB)
   MaxNewSize               = 1417674752 (1352.0MB)
   OldSize                  = 177733632 (169.5MB)
   NewRatio                 = 2
   SurvivorRatio            = 8
   MetaspaceSize            = 21807104 (20.796875MB)
   CompressedClassSpaceSize = 1073741824 (1024.0MB)
   MaxMetaspaceSize         = 17592186044415 MB
   G1HeapRegionSize         = 0 (0.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 66584576 (63.5MB)
   used     = 9337216 (8.9046630859375MB)
   free     = 57247360 (54.5953369140625MB)
   14.023091473917322% used
From Space:
   capacity = 11010048 (10.5MB)
   used     = 0 (0.0MB)
   free     = 11010048 (10.5MB)
   0.0% used
To Space:
   capacity = 11010048 (10.5MB)
   used     = 0 (0.0MB)
   free     = 11010048 (10.5MB)
   0.0% used
PS Old Generation
   capacity = 177733632 (169.5MB)
   used     = 0 (0.0MB)
   free     = 177733632 (169.5MB)
   0.0% used

3517 interned Strings occupying 287072 bytes.

2)jmap -dump:format=b,file=d:/temp/jmap_temp.hprof 8664 :【非常重要】

把进程id 为8664的进程内存快照转储到 jmap_temp.hprof 文件; 

D:\workbench_idea\java8test>jmap -dump:format=b,file=d:/temp/jmap_temp.hprof 8664
Dumping heap to D:\temp\jmap_temp.hprof ...
Heap dump file created

2.1)如何打开这个文件? 使用 visualVM 打开;

点击文件,选择装入,选择对应的 hprof文件(堆转储);


【3.1.4】jstat -jvm统计检测工具

用来显示垃圾回收信息,类加载信息,新生代统计信息等; 

  • 1)总结垃圾回收统计: jstat -gcutil pid
  • 2)垃圾回收统计: jstat -gc pid
D:\workbench_idea\java8test>jstat -gcutil 8664
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  0.00   0.00  14.02   0.00  17.30  19.90      0    0.000     0    0.000    0.000

D:\workbench_idea\java8test>jstat -gc 8664
 S0C    S1C    S0U    S1U      EC       EU        OC         OU       MC     MU    CCSC   CCSU   YGC     YGCT    FGC    FGCT     GCT
10752.0 10752.0  0.0    0.0   65024.0   9118.4   173568.0     0.0     4480.0 775.1  384.0   76.4       0    0.000   0      0.000    0.000


【3.2】可视化工具

【3.2.1】jconsole

用于对jvm内存,线程,类的监控,是一个基于 jmx的GUI性能监控工具 ;

【3.2.2】VisualVM

能够监控线程,内存情况,查看方法的cpu时间和内存中的对象,已被GC对象,反向查看分配的堆栈;


【4】内存溢出排查

1)构建内存溢出场景

public class OOMTest {

    public static void main(String[] args) {
        ArrayList<String> userNameList = new ArrayList<>();
        while(true) {
            userNameList.add("zhangsan") ;
        }
    }
}

步骤1)设置jvm运行参数:

(使用jvm 运行参数获取 dump文件:有些情况是内存溢出后程序中断,而 jmap 打印的是运行程序,所以可以通过ijvm运行参数生成dump文件)

-Xmx10m
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=D:\temp\jvm_jmap

运行后,抛oom异常如下:

 

 步骤2)使用 VisualVm 分析dump文件;

jdk/bin/jvisualvm.exe 运行,点击左上角文件按钮,选择装入, 选择 hprof文件;

步骤3)点击显示线程,可以查看oom的代码栈;


【5】 cpu使用率升高排查思路

  1. 使用 top 命令查看cpu使用情况;(找出使用cpu最多的pid=2266
  2. ps H -eo pid,tid,%cpu | grep 2266 :打印cpu中进程2266所有线程使用cpu情况
  3. Jstack 2266(pid): 打印进程2266的所有线程;
    1. 从打印结果中找到第2步线程id对应的代码行号

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值