概述
从jdk5开始,在jdk中自带的Java监控和管理控制台.
用于对jvm中的内存(内存分的展示的也比较细致)、线程(线程有多少个)和类(加载了多少个类)等监控,
建议直接跳过JConsole,直接学习Visual VM ,毕竟这两个都是jdk自带的。
使用
启动方式
两种启动方式:
1.在jdk安装目录中找到jconsole.exe,双击该可执行文件就可以
2. 打开cmd 的 DOS窗口,直接输入jconsole就可以了
连接方式
Local
使用JConsole连接一个正在本地系统运行的JVM,并且执行程序的和运行JConsole的需要是同一个用户。JConsole使用文件系统的授权通过RMI连接起链接到平台的MBean的服务器上。这种从本地连接的监控能力只有Sun的JDK具有。
注意:本地连接要求 启动jconsole的用户 和 运行当前程序的用户 是同一个用户
具体操作如下:
1、在DOS窗口中输入jconsole
2、在控制台上填写相关信息
3、选择“不安全的连接”
4、进入控制台页面

Remote
使用下面的URL通过RMI连接器连接到一个JMX代理,service:jmx:rmi:///jndi/rmi://hostName:portNum/jmxrmi。JConsole为建立连接,需要在环境变量中设置mx.remote.credentials来指定用户名和密码,从而进行授权。
Advanced
使用一个特殊的URL连接JMX代理。一般情况使用自己定制的连接器而不是RMI提供的连接器来连接JMX代理,或者是一个使用JDK1.4的实现了JMX和JMX Rmote的应用
功能演示基本演示
import java.util.ArrayList;import java.util.Random;/*** -Xms600m -Xmx600m -XX:SurvivorRatio=8* @author shkstart shkstart@126.com* @create 2020 17:51*/public class HeapInstanceTest {byte[] buffer = new byte[new Random().nextInt(1024 * 100)];public static void main(String[] args) {try {Thread.sleep(3000);} catch (InterruptedException e) {e.printStackTrace();}ArrayList<HeapInstanceTest> list = new ArrayList<HeapInstanceTest>();while (true) {list.add(new HeapInstanceTest());try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}}}}
启动上面的代码
选择你启动的Java进程
选择“不安全的连接”


内存区域
程序在执行的过程中跑的线程有哪些
加载的类的个数

虚拟机的概述信息

演示检测死锁
public class ThreadDeadLock {public static void main(String[] args) {StringBuilder s1 = new StringBuilder();StringBuilder s2 = new StringBuilder();new Thread(){@Overridepublic void run() {synchronized (s1){s1.append("a");s2.append("1");try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}synchronized (s2){s1.append("b");s2.append("2");System.out.println(s1);System.out.println(s2);}}}}.start();new Thread(new Runnable() {@Overridepublic void run() {synchronized (s2){s1.append("c");s2.append("3");try {Thread.sleep(100);} catch (InterruptedException e) {e.printStackTrace();}synchronized (s1){s1.append("d");s2.append("4");System.out.println(s1);System.out.println(s2);}}}}).start();}}
执行上面的main方法,然后用下面的jConsole就能看到死锁了.

