JConsole(Java Monitoring and Management Console)是一种基于JMX的可视化监视、管理工具。它管理部分的功能是针对 JMX MBean 进行管理,由于 MBean 可以使用代码、中间件服务器的管理控制台或者所有符合 JMX 规范的软件进行访问。
我们先写一个测试程序运行起来方便监视:
SimpleQueue.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| import java.util.Random; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit;
public class SimpleQueue {
public static void main(String[] args) { final BlockingQueue<Integer> queue = new LinkedBlockingQueue<>();
Runnable prodTask = () -> { Random random = new Random(); while (true) { int num = random.nextInt(1000000); int mills = random.nextInt(1000); queue.offer(num); System.out.println("thread[" + Thread.currentThread().getName() + "] offer " + num + " to queue and then sleep " + mills + " ms"); try { Thread.sleep(mills); } catch (InterruptedException e) { e.printStackTrace(); } } };
Runnable conTask = () -> { Random random = new Random(); while (true) { int mills = random.nextInt(1000); try { Integer num = queue.poll(mills, TimeUnit.MILLISECONDS); System.out.println("thread[" + Thread.currentThread().getName() + "] poll " + num + " with in " + mills + " ms"); } catch (InterruptedException e) { e.printStackTrace(); } } };
ExecutorService threadPool = Executors.newFixedThreadPool(4); threadPool.execute(prodTask); threadPool.execute(prodTask); threadPool.execute(conTask); threadPool.execute(conTask); } }
|
然后打开 JDK/bin 下的 jconsole.exe 启动 JConsole 后,将自动搜索出本机运行的所有虚拟机进程,不需要使用 jps
来查询了,如下所示:
我们双击上面的程序打开监控,从控制面板中我们可以清晰的看到线程、内存等各种监控信息
文章摘自《深入理解Java虚拟机》第二版 周志明著,仅作为学习记录,书籍中用到的案例代码及描述有部分修改,但未改变原意。