目录

Life in Flow

知不知,尚矣;不知知,病矣。
不知不知,殆矣。

X

虚拟机图形化工具

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 线程验证

线程 3
线程 4

 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

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

作者:Soulboy