Note:不要用JDK自带的,从官网下载一个:
打开之后是这个样子的(首先可以生成一个堆转储文件,用jvisualVM打开这个堆转储文件.hprof)
下面展示怎么查找大对象是由哪个方法产生的(OOM排查),可以观看IT老齐的视频:
【IT老齐043】IT老齐线上Java OOM排查与解决过程分享(下)_哔哩哔哩_bilibili
Open in New Tab:
这个大对象到底是哪个方法执行的时候产生的?可以查看GC Root信息:
显示GC Root信息,然后在GC root上右键->select in threads,去查看具体的方法信息
找到具体的方法。
JVM性能监控工具包括命令行工具和可视化工具,命令行工具当然要掌握,但是可视化工具更加强大,比如jconsole,jvisualVM(功能更加强大,可以替代jconsole)。
jvisualVM可是视作命令行工具的一个集成,包含了几乎所有命令行工具的功能。现在来简单介绍一下jvisualVM, 它可以监控线程信息,堆内存使用(使用率,所有对象信息),方法区使用(metaspace, 代码缓存,压缩类数据),GC,类加载信息等等
jvisualVM还可以安装插件,对功能进行扩展,例如安装"Visual GC"插件,可以实时地可视化的观察堆内存以及GC的情况
写一个简单的死锁程序:
package com.jvm.perform.optimize;
/**
* DeadLock
* @author bwang018
*
*/
public class JstackCommendTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
StringBuilder builder1 = new StringBuilder();
StringBuilder builder2 = new StringBuilder();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
synchronized(builder1) {
builder1.append("a");
builder2.append("1");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized(builder2) {
builder1.append("b");
builder2.append("1");
System.out.println(builder1);
System.out.println(builder2);
}
}
// synchronized(builder2) {
// builder1.append("b");
// builder2.append("1");
// System.out.println(builder1);
// System.out.println(builder2);
// }
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
synchronized(builder2) {
builder1.append("a");
builder2.append("2");
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized(builder1) {
builder1.append("b");
builder2.append("2");
System.out.println(builder1);
System.out.println(builder2);
}
}
// synchronized(builder1) {
// builder1.append("b");
// builder2.append("2");
// System.out.println(builder1);
// System.out.println(builder2);
// }
}
}).start();
}
}
运行之后,用jvisualVM进行监控,直接在cmd中运行:
可以监控到发生了死锁。