虚拟机图形化工具
Jconsole
JConsole (Java Monitoring and Management Console)是一种基于 JMX 的可视化监视、管理工具,它管理部分的功能是针对 JMXMBean 进行管理,由于 MBean 可以使用代码、中间件服务器的管理控制台或者所有符合 JMX 规范的软件进行访问。
jconsole 集成了线程与内存的可视化展示。
Jconsole 连接方式
- 本地连接:通过 JDK/bin 目录下的“jconsole.exe”启动 JConsole 后,将自动搜索出本机运行的所有虚拟机进程,不需要用户自己再使用 jps 来查询了。
- 远程连接
1# 生成项目jar
2mvn install
3
4# scp将jar包进行远程复制
5sudo scp /Users/daniel/Desktop/jvm-demo-0.0.1-SNAPSHOT.jar root@172.16.244.151:/usr/local
6
7# 将jar包启动
8 #nohup代表以守护线程的方式启动
9 # -Dcom.sun.management.jmxremote.port 开启远程访问JXM端口
10nohup java -Xms800m -Xmx800m -XX:PermSize=256m -XX:MaxPermSize=512m -XX:MaxNewSize=512m -Dcom.sun.management.jmxremote.port=9999 -Djava.rmi.server.hostname=192.168.31.220 -Dcom.sun.management.jmxremote.ssl=false
11-Dcom.sun.management.jmxremote.authenticate=false -jar /test/jvm-demo-0.0.1-SNAPSHOT.jar &
12
13# 远程连接
14 远程进程: 192.168.31.220:9999
15 用户名:root 密码:123
Jconsole 内存监控验证
模拟内存增长示例
1public class JconsoleMemory {
2 public byte[] b1 = new byte[1024 * 512];
3
4 public static void main(String[] args) throws InterruptedException {
5 System.out.println("main thread start!");
6 Thread.sleep(10000); //休眠10秒
7 allocate(10000);
8 }
9
10 private static void allocate(int n){
11 List<JconsoleMemory> jconsoleMemoryList = new ArrayList<>();
12 for (int i = 0; i < n; i++) {
13 try {
14 Thread.sleep(100);
15 } catch (InterruptedException e){
16 e.printStackTrace();
17 }
18 jconsoleMemoryList.add(new JconsoleMemory());
19 }
20 }
21}
Jconsole 线程验证
1@SpringBootApplication
2@EnableAutoConfiguration
3public class DemoApplication {
4
5 public static void main(String[] args) {
6 SpringApplication.run(DemoApplication.class, args);
7 }
8
9 private static Object lock1 = new Object();
10 private static Object lock2 = new Object();
11
12 class WaitCondition{
13 boolean isOpen = false;
14 public void setOpen(){
15 isOpen = true;
16 }
17 }
18
19 WaitCondition waitCondition = new WaitCondition();
20
21 /**
22 * 在springboot项目启动的时候所执行的方法
23 * 在bean加载完但用户线程进来之前执行的方法
24 */
25 @PostConstruct
26 public void deadLock(){
27 new Thread(()->{
28 synchronized (lock1){
29 try {
30 System.out.println(Thread.currentThread().getName()+"得到Lock1");
31 Thread.sleep(3000L);
32 }catch (Exception e){
33 e.printStackTrace();
34 }
35 synchronized (lock2){
36 System.out.println(Thread.currentThread().getName()+"得到Lock2");
37 }
38 }
39 },"线程1").start();
40
41
42 new Thread(()->{
43 synchronized (lock2){
44 try {
45 System.out.println(Thread.currentThread().getName()+"得到Lock2");
46 Thread.sleep(3000L);
47 }catch (Exception e){
48 e.printStackTrace();
49 }
50 synchronized (lock1){
51 System.out.println(Thread.currentThread().getName()+"得到Lock1");
52 }
53 }
54 },"线程2").start();
55
56 new Thread(()->{
57 synchronized (waitCondition){
58 while (!waitCondition.isOpen){
59 try {
60 waitCondition.wait();
61 } catch (InterruptedException e) {
62 e.printStackTrace();
63 }
64 }
65 }
66 },"线程3").start();
67
68 new Thread(()->{
69 synchronized (waitCondition){
70 while (!waitCondition.isOpen){
71 try {
72 waitCondition.wait(1000000);
73 } catch (InterruptedException e) {
74 e.printStackTrace();
75 }
76 }
77 }
78 },"线程4").start();
79 }
80}
VisualVM
VisualVM 是一个集成命令行 JDK 工具和轻量级分析功能的可视化工具。
VisualVM 整合 IDEA
1# 安装插件
2 搜索visualvm
3
4# 点击配置VisualVM executable执行路径
5 setting搜索visualvm
6 F:/Development/JDK1.8/bin/jvisualvm.exe
线程 dump
1"线程4" #34 prio=5 os_prio=0 tid=0x000000001f26d800 nid=0x3e9c in Object.wait() [0x00000000250cf000]
2
3 java.lang.Thread.State: TIMED_WAITING (on object monitor)
4
5 at java.lang.Object.wait(Native Method)
6 - waiting on <0x0000000772319a10> (a com.xdclass.jvm.DemoApplication$WaitCondition)
7 at com.xdclass.jvm.DemoApplication.lambda$deadLock$3(DemoApplication.java:83)
8 - locked <0x0000000772319a10> (a com.xdclass.jvm.DemoApplication$WaitCondition)
9 at com.xdclass.jvm.DemoApplication$$Lambda$299/1687627235.run(Unknown Source)
10 at java.lang.Thread.run(Thread.java:745)
11
12 Locked ownable synchronizers:
13 - None
14
15"线程3" #33 prio=5 os_prio=0 tid=0x0000000023996800 nid=0x9c in Object.wait() [0x0000000024fcf000]
16 java.lang.Thread.State: WAITING (on object monitor)
17 at java.lang.Object.wait(Native Method)
18 - waiting on <0x0000000772319a10> (a com.xdclass.jvm.DemoApplication$WaitCondition)
19 at java.lang.Object.wait(Object.java:502)
20 at com.xdclass.jvm.DemoApplication.lambda$deadLock$2(DemoApplication.java:70)
21 - locked <0x0000000772319a10> (a com.xdclass.jvm.DemoApplication$WaitCondition)
22 at com.xdclass.jvm.DemoApplication$$Lambda$298/1971152916.run(Unknown Source)
23 at java.lang.Thread.run(Thread.java:745)
24
25 Locked ownable synchronizers:
26 - None