7.1Jmap,Jstack,Jinfo 命令详解
1)前置动作,启动一个或多个javaWeb程序
jps查询应用程序进程Id

jmap -histo 14660 #查看历史生成的实例 可以指定生成文件路径
jmap -histo:live 14660 #查看当前存活的实例,执行过程中可能会触发一次full gc
打开log.txt,文件内容如下:
-
num:序号
-
instances:实例数量
-
bytes:占用空间大小
-
class name:类名称,[C is a char[],[S is a short[],[I is a int[],[B is a byte[],[[I is a int[] []
2)堆信息
jmap -heap 进程Id

堆内存dump
jmap -dump:format=b,file=eureka.hprof 14660
也可以设置内存溢出自动导出dump文件(内存很大的时候,可能会导不出来)
- -XX:+HeapDumpOnOutOfMemoryError
- -XX:HeapDumpPath=./ (路径)
测试代码如下:
public class OOMTest {public static List<Object> list = new ArrayList<>();// JVM设置 // -Xms10M -Xmx10M -XX:+PrintGCDetails -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=D:\jvm.dump public static void main(String[] args) {List<Object> list = new ArrayList<>();int i = 0;int j = 0;while (true) {list.add(new User(i++, UUID.randomUUID().toString()));new User(j--, UUID.randomUUID().toString());}}
}
可以用jvisualvm命令工具导入该dump文件分析,可以很清晰的看到据图是哪个类占用内存比较大。
Jstack
用jstack加进程id查找死锁,见如下示例
public class DeadLockTest {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");}
}

“Thread-1” 线程名
prio=5 优先级=5
tid=0x000000001fa9e000 线程id
nid=0x2d64 线程对应的本地线程标识nid
java.lang.Thread.State: BLOCKED 线程状态
Jinfo
查看正在运行的Java应用程序的扩展参数
查看jvm的参数
jinfo 进程id
jinfo -sysproos 进程id
总结:
上面几个命令是JDK自带,可以查看一些项目运行情况,jps 查看应用进程ID,jmap 查看内存信息,实例个数及占用内存大小,jstack 找进程死锁,jinfo查看jvm相关参数,这几个命令最常用的是jps。
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
