5. JVM调优工具详解及调优实战(这里有我的实战案例预制构件生产管理平台)
创始人
2024-04-16 23:47:25

1. Jmap,Jstack,Jinfo命令详解

1.1 Jmap

此命令可以用来查看内存信息,实例个数以及占用内存大小
jps 先查看有哪些java程序
在这里插入图片描述

  • jmap -histo 16492 > ./log.txt
    在这里插入图片描述
    在这里插入图片描述
  • jmap -heap 16492
    查看堆的信息
    在这里插入图片描述

查看堆年轻代老年代的使用情况

在这里插入图片描述

  • 堆内存dump (导一个快照出来)
    jmap -dump:format=b,file=eureke.hprof 16492

在这里插入图片描述
这里生成了一个文件
在这里插入图片描述
然后我们使用jvisualvm

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
主要看这里

在这里插入图片描述
这里我们可以设置内存溢出自动导入dump文件(内存很大的时候,可能会导不出来)

  1. -XX:+HeapDumpOnOutOfMemoryError
  2. -XX:HeapDumpPath=./(路径)

在这里插入图片描述
这里生成了一个dump文件,将他载入jvisualvm

在这里插入图片描述
这里我们就可以看到user很多

在这里插入图片描述

1.2 Jstack

用Jstack加进程ID查找死锁

代码如下

pubilc class test{private static Object lock1 = new Object();private static Object lock2 = new Object();public static void main(String[] args) {new Thread(()->{synchronized (lock1){try {System.out.println("thread1 begin");Thread.sleep(5000);}catch (InterruptedException e){}synchronized (lock2){System.out.println("thread1 end");}}}).start();new Thread(()->{synchronized (lock2){try {System.out.println("thread2 begin");Thread.sleep(5000);}catch (InterruptedException e){}synchronized (lock1){System.out.println("thread2 end");}}}).start();System.out.println("main thread end");}
}

在这里插入图片描述
这里就死锁了
这个是我死锁的线程
在这里插入图片描述
使用jstack

在这里插入图片描述
死锁的位置

在这里插入图片描述
这里对应代码的行数 有些许区别

在这里插入图片描述
用jvisualvm也可以识别死锁

在这里插入图片描述

  • jstack找出CPU占用最高的堆栈信息
    这里举个例子
package com.qm.boot.web.part.controller;import com.qm.boot.web.admin.entity.SysUser;public class Test {public static  final int initData = 666;public static SysUser sysUser = new SysUser();public int compute(){ //每一个方法对应一块栈帧内存区域int a = 1;int b = 1;int c = (a+b)+10;return c;}public static void main(String[] args) {Test test = new Test();while (true){test.compute();}}}

这个代码不断死循环,一定会让cpu变高

在这里插入图片描述
在这里插入图片描述

1.3Jinfo

查看正在运行的java程序的扩展参数
查看JVM参数

在这里插入图片描述
在这里插入图片描述

1.4 Jstat (用的最多的)

jstat 命令可以查看堆得各部分使用情况,以及加载类的数量

jstat -gc pid 最常用,可以评估程序内存使用及GC压力整体情况
在这里插入图片描述

  • YGC :从启动开始执行的youngGc
  • YGCT:从启动开始花费了多少秒
  • FGC:从启动开始发生了多少次fullGc
  • FGCT:从启动开始fullGc花费了多少秒
  • GCT:youngGc和fullGc花费时间之和

jstat -gc 14904 1000 10

在这里插入图片描述
这里我们可以看到元空间基本被使用完了

这里有个问题 我们发现刚刚启动项目 我们发现做了35次minorJc 4次full Gc 那么肯定有问题,
那么我们怎么处理一下呢,

首先画一个内存模型

在这里插入图片描述
几乎实在20秒内,这肯定不可以,那么我们处理一下

  • 我估计是开启了动态年轻判断机制,就是s0太小了 每次超过了50% 那么就会想old区域 放入数据,old 放满之后触发fullGC
  • 那么我觉得可以调大新生代的内存 开始占了堆内存的3分之1 ,那么我调成三分之二,然后确实fullGC 没了

在这里插入图片描述

  • 然后我估计为什么频繁的出发了minor Jc ,那么在调大点比例
    这个方法可以修改-XX:NewRatio=4,表示新生代占1,老年代占4,新生代占整个堆的1/5,
    当然开发人员可以通过选项“-XX :SurvivorRatio”调整这个空间比例。比如-XX : SurvivorRatio=8

然后扩大一下内存那么最后变成了

在这里插入图片描述
这是最后的调优参数

-Xmx1024M -Xms1024M -Xmn768M -Xss1M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M

相关内容

热门资讯

demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...