此命令可以用来查看内存信息,实例个数以及占用内存大小
jps 先查看有哪些java程序




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

jmap -dump:format=b,file=eureke.hprof 16492
这里生成了一个文件

然后我们使用jvisualvm



主要看这里

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

这里生成了一个dump文件,将他载入jvisualvm

这里我们就可以看到user很多

用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也可以识别死锁

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变高


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


jstat 命令可以查看堆得各部分使用情况,以及加载类的数量
jstat -gc pid 最常用,可以评估程序内存使用及GC压力整体情况

jstat -gc 14904 1000 10

这里我们可以看到元空间基本被使用完了
这里有个问题 我们发现刚刚启动项目 我们发现做了35次minorJc 4次full Gc 那么肯定有问题,
那么我们怎么处理一下呢,
首先画一个内存模型

几乎实在20秒内,这肯定不可以,那么我们处理一下

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

这是最后的调优参数
-Xmx1024M -Xms1024M -Xmn768M -Xss1M -XX:MetaspaceSize=256M -XX:MaxMetaspaceSize=256M