概述

从jdk5开始,在jdk中自带的Java监控和管理控制台.
用于对jvm中的内存(内存分的展示的也比较细致)、线程(线程有多少个)和类(加载了多少个类)等监控,

建议直接跳过JConsole,直接学习Visual VM ,毕竟这两个都是jdk自带的。

使用

启动方式

两种启动方式:
1.在jdk安装目录中找到jconsole.exe,双击该可执行文件就可以
2. 打开cmd 的 DOS窗口,直接输入jconsole就可以了

连接方式

Local

  1. 使用JConsole连接一个正在本地系统运行的JVM,并且执行程序的和运行JConsole的需要是同一个用户。JConsole使用文件系统的授权通过RMI连接起链接到平台的MBean的服务器上。这种从本地连接的监控能力只有SunJDK具有。

注意:本地连接要求 启动jconsole的用户 和 运行当前程序的用户 是同一个用户

具体操作如下:
1、在DOS窗口中输入jconsole
image.png
2、在控制台上填写相关信息
image.png
3、选择“不安全的连接”
image.png
4、进入控制台页面

image.png

Remote

  1. 使用下面的URL通过RMI连接器连接到一个JMX代理,service:jmx:rmi:///jndi/rmi://hostName:portNum/jmxrmi。JConsole为建立连接,需要在环境变量中设置mx.remote.credentials来指定用户名和密码,从而进行授权。

Advanced

  1. 使用一个特殊的URL连接JMX代理。一般情况使用自己定制的连接器而不是RMI提供的连接器来连接JMX代理,或者是一个使用JDK1.4的实现了JMXJMX Rmote的应用

功能演示基本演示

  1. import java.util.ArrayList;
  2. import java.util.Random;
  3. /**
  4. * -Xms600m -Xmx600m -XX:SurvivorRatio=8
  5. * @author shkstart shkstart@126.com
  6. * @create 2020 17:51
  7. */
  8. public class HeapInstanceTest {
  9. byte[] buffer = new byte[new Random().nextInt(1024 * 100)];
  10. public static void main(String[] args) {
  11. try {
  12. Thread.sleep(3000);
  13. } catch (InterruptedException e) {
  14. e.printStackTrace();
  15. }
  16. ArrayList<HeapInstanceTest> list = new ArrayList<HeapInstanceTest>();
  17. while (true) {
  18. list.add(new HeapInstanceTest());
  19. try {
  20. Thread.sleep(10);
  21. } catch (InterruptedException e) {
  22. e.printStackTrace();
  23. }
  24. }
  25. }
  26. }

启动上面的代码
image.png

选择你启动的Java进程

选择“不安全的连接”

image.png

image.png


内存区域
image.png


程序在执行的过程中跑的线程有哪些
image.png


加载的类的个数

image.png


虚拟机的概述信息

image.png

演示检测死锁

  1. public class ThreadDeadLock {
  2. public static void main(String[] args) {
  3. StringBuilder s1 = new StringBuilder();
  4. StringBuilder s2 = new StringBuilder();
  5. new Thread(){
  6. @Override
  7. public void run() {
  8. synchronized (s1){
  9. s1.append("a");
  10. s2.append("1");
  11. try {
  12. Thread.sleep(100);
  13. } catch (InterruptedException e) {
  14. e.printStackTrace();
  15. }
  16. synchronized (s2){
  17. s1.append("b");
  18. s2.append("2");
  19. System.out.println(s1);
  20. System.out.println(s2);
  21. }
  22. }
  23. }
  24. }.start();
  25. new Thread(new Runnable() {
  26. @Override
  27. public void run() {
  28. synchronized (s2){
  29. s1.append("c");
  30. s2.append("3");
  31. try {
  32. Thread.sleep(100);
  33. } catch (InterruptedException e) {
  34. e.printStackTrace();
  35. }
  36. synchronized (s1){
  37. s1.append("d");
  38. s2.append("4");
  39. System.out.println(s1);
  40. System.out.println(s2);
  41. }
  42. }
  43. }
  44. }).start();
  45. }
  46. }

执行上面的main方法,然后用下面的jConsole就能看到死锁了.

image.png