Java虚拟机-虚拟机工具
java process status显示本地虚拟机唯一id lvmid(local virtual machine id本地和进程id一致)
参数:-l 打印运行的主类
-m 打印主类运行参数
-v 打印主类vm参数
2.jstat
监视虚拟机运行的状态信息,类装载,内存,垃圾收集,jit编译的信息。
元空间的本质和永久带类似,都是对JVM规范中方法区的实现。不过元空间与永久代之间最大的区别在于:元空间并不在虚拟机中,而是使用本地内存。因此,默认情况下,元空间的大小仅受本地内存限制。
3.jinfo
实时查看和调整虚拟机的各项参数。
4.jmap
生成堆转储快照。
5.jhat
JVM heap ayalysis tool,以图形化的方式分析堆转储快照。
6.jstack
生成虚拟机当前时刻的线程快照,定位线程出现长时间停顿的原因。
7.jconsole
(1)内存分析
public class JConsoleTest {
public static void main(String[] args) {try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("start...");
fill(1000);
}
private static void fill(int n) {
List<JConsoleTest> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
list.add(new JConsoleTest());
}
}
}
运行这段代码,然后运行jconsole命令选择JConsoleTest这个主类,可以看到以下几个界面:
从图上可以看出,在代码运行结束之前总的堆内存,新生代,Survivor区,老年代的使用量是增长的。使用jconsole我们可以监测应用内存不同区域的使用情况。
(2)线程监控
public class ThreadTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
sc.next();
new Thread(new Runnable() {
@Override
public void run() {
while(true) {
}
}
}, "whileTrue").start();
sc.next();
testWait(new Object());
}
new Thread(new Runnable() {
@Override
public void run() {
synchronized (obj) {
try {
obj.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}, "wait").start();
}
}
选择上面页面的线程选项卡:
从上图我们可以知道main线程在等待用户输入,但线程还是RUNNABLE状态。
whileTrue线程处于空循环状态。
wait线程处于等待状态。
(3)死锁
jconsole可以检测死锁。
public class DeadLock implements Runnable {
private Object obj1;
private Object obj2;
public DeadLock(Object obj1, Object obj2) {
this.obj1 = obj1;
this.obj2 = obj2;
}
@Override
public void run() {
synchronized (obj1) {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
synchronized (obj2) {
System.out.println("something");
}
}
}
}
public class DeadLockTest {
public static void main(String[] args) {
Object obj1 = new Object();
Object obj2 = new Object();
new Thread(new DeadLock(obj1, obj2)).start();
new Thread(new DeadLock(obj2, obj1)).start();
}
}
运行代码,观察jconsole:
检测到了死锁发生在Thread-1和Thread-2线程之间。