Jconsole: JAVA 监视和管理控制台简介
###Jconsole: JAVA 监视和管理控制台简介
JDK中除了提供大量的命令行之外,还提供两个功能强大的可视化工具:JConsole和VisualVM。 之前对java的调试一直停留在 右键->debug as ,实在惭愧,今天看了下,索性当个读书笔记记录,果然我JAVA大法好,hhh......
启动JConsole
通过D:\Program Files\Java\jdk1.7.0_71\bin
找到jconsole.exe
启动,这个位置取决于本机安装的java路径。类似jps命令,显示本机运行的所有虚拟机进程。可支持本地进程和远程进程。
双击选择一个进程,看到如下:
“概述”显示整个虚拟机主要运行数据的概览,其中包括“堆内存使用情况”、“线程”、“类”、“CPU使用情况”4中信息的曲线图,这些曲线图是后面“内存”、“线程”、“类”页签的信息汇总。
内存监控
相当于可视化的jstat
命令,用于监视受收集器管理的虚拟机内存(JAVA堆和永久代)的变化趋势。
线程监控
相当于可视化jstack
命令,遇到线程停顿时可是用这个页签进行监控分析。而jstack命令中 线程长时间停顿的主要原因有:
等待外部资源(数据库连接,网络资源,设备资源等)
死循环
锁等待(活锁和死锁)
通过例子进行说明:
代码如下:
package com.xjtu.imiss.chapter4;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class MonitoringTest {
/**
* 线程死循环演示
*/
public static void createBusyThread() {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
while (true);// 第15行
}
}, "testBusyThread");
thread.start();
}
/**
* 线程锁等待演示
*/
public static void createLockThread(final Object lock) {
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
synchronized (lock) {
try {
lock.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}, "testLockThread");
thread.start();
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
br.readLine();
createBusyThread();
br.readLine();
Object obj = new Object();
createLockThread(obj);
}
}
程序运行后,首先在“线程”页签选择main线程,如下所示:
堆栈追踪显示BufferedReader
在readBytes方法中等待System.in的键盘输入,这时线程为Runnable状态,Runnable状态的线程会被分配运行时间,但readBytes方法检查到流没有更新时候就会归还执行令牌,这种等待只消耗很小的CPU资源。
下来看testBusyThread线程,一直执行空循环,从状态中看到代码停留在while(true)这一行,此时线程为Runnable装啊提,而且没有归还线程令牌的动作会在空循环用尽全部执行时间,直到线程切换,这种等待比较消耗CPU资源。
下来是testLockThread线程等到这lock对象的notify 或者notifyAll方法的出现,此时线程处于waiting状态,在被唤醒之前不会被分配执行时间。
testLockThread处于正常的活锁等待,只要lock对象的notify()或者notifyAll()方法被调用,这个线程就能激活并继续执行。下面演示一个无法再被激活的死锁等待。
package com.xjtu.imiss.chapter4;
public class MonitoringTest {
/**
* 线程死锁等待演示
*/
static class SynAddRunalbe implements Runnable {
int a, b;
public SynAddRunalbe(int a, int b) {
this.a = a;
this.b = b;
}
@Override
public void run() {
synchronized (Integer.valueOf(a)) {
synchronized (Integer.valueOf(b)) {
System.out.println(a + b);
}
}
}
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) {
new Thread(new SynAddRunalbe(1, 2)).start();
new Thread(new SynAddRunalbe(2, 1)).start();
}
}
}
这段代码开了200个线程分别计算1+2以及2+1的值,其实for循环可省略,因为两个线程也能导致死锁,不过那样概率很小,需要尝试运行多词才能看到效果。一般的话,带for循环的版本最多运行2~3次就会遇到线程死锁,程序无法结束。造成死锁的原因是Integer.valueOf()方法基于减少对象创建和节省内存的考虑,[-128,127]之间的数字会被缓存,当valueOf()方法传入参数在这个范围内,将直接返回缓存中的对象。也就是说,代码调用了200次Integer.valueOf()一共就返回两个不同的对象。
假如在某个线程的synchronized块之间发生了一次线程切换,那就会出现线程A等待线程B持有的Integer.valueOf(1),线程B又等待线程A持有的Integer.valueOf(2),结果大家都跑不下去了。
点击“检测到死锁”,查看结果如下:
主要参考深入理解JAVA虚拟机 jvm高级特性和最佳实践这本书,感谢作者多谢大牛~~
Jconsole: JAVA 监视和管理控制台简介的更多相关文章
- cmd下【java监视和管理控制台】
不需要安装插件,只要jmeter的运行环境配置好就可以了:打开这个小工具的步骤很简单,如果你已经配置好了Jmeter运行的环境,那么你也就不用去做其他的配置,直接 点击:开始——>运行——> ...
- Java 自带性能监控工具:监视和管理控制台 jconsole 的使用
1. 前言想验证你对 jvm 配的一些调优参数(比如 Xms.Xmx 等)有没有起作用吗?想不想实时监控你自定义的线程池的在实际运行时的线程个数.有没有死锁?应用出现 java.lang.OutOfM ...
- jmeter 环境java监视和管理控制
打开这个小工具的步骤很简单,如果你已经配置好了Jmeter运行的环境,那么你也就不用去做其他的配置,直接 点击:开始——>运行——>输入cmd——>然后在出现的命令行界面输入“jco ...
- Lucene:基于Java的全文检索引擎简介
Lucene:基于Java的全文检索引擎简介 Lucene是一个基于Java的全文索引工具包. 基于Java的全文索引/检索引擎--Lucene Lucene不是一个完整的全文索引应用,而是是一个用J ...
- java assert的用法简介【转】
assert的基本用法 assertion(断言)在软件开发中是一种常用的调试方式,很多开发语言中都支持这种机制,如C,C++和Eiffel等,但是支持的形式不尽相同,有的是通过语言本身.有的是通过库 ...
- Java的MVC模式简介
Java的MVC模式简介 MVC(Model View Control)模型-视图-控制器 首先我们需要知道MVC模式并不是javaweb项目中独有的,MVC是一种软件工程中的一种软件架构模式,把软件 ...
- java的配置方式简介
1,java的配置方式简介java的配置方式是为了代替使用xml配置方式,主要使用两个注解:@Configuration//通过该注解来表明该类是一个spring的配置,相当于一个xml文件@Comp ...
- Java线程之线程简介
Java线程之线程简介 一.何谓线程 明为跟踪处理流程,实为跟踪线程 阅读程序时,我们会按处理流程来阅读. 首先执行这条语句 ↓ 然后执行这条语句 ↓ 接着再执行这条语句…… 我们就是按照上面这样的流 ...
- Java Content Repository API 简介 转自(https://www.ibm.com/developerworks/cn/java/j-jcr/)
Java Content Repository API 简介 1 如果曾经试过开发内容管理应用程序,那么您应当非常清楚在实现内容系统时所遇到的固有难题.这个领地有点支离破碎,许多供应商都有自己的私有仓 ...
随机推荐
- 《Java程序员面试笔试宝典》之Java变量命名有哪些规则
在Java语言中,变量名.函数名.数组名统称为标识符,Java语言规定标识符只能由字母(a~z,A~Z).数字(0~9).下划线(_)和$组成,并且标识符的第一个字符必须是字母.下划线或$.此外,标识 ...
- C语言漫谈(二) 图像显示 Windows和Linux
关于图像显示有很多库可以用,Windows下有GDI,GDI+,D3D等,Linux下有X Window和Wayland,此外还有OpenGL ,SDL等图形库以及各种GUI库. 了解最原始的方式,对 ...
- DirectX 初始化DirectX(手写和红龙书里面的方式)
上次介绍了如何初始化Direct3D,这次手写一次初始化代码,都是一样的方式不过看起来整洁一点. 创建一个Win32空项目添加一个空类增加以下代码即可. #include "CreateDe ...
- 导致flash屏幕重绘的几种方式及避免重绘的方法
导致屏幕重绘的几种原因: 1.最常见的是情况就是舞台上的可视组件在形状.位置.状态(alpha, scale…)发生改变的时候会触发Flash Player 的重绘. 2.当一个DisplayObje ...
- 文件读写IO
摘要:本文主要总结了以下有关文件读写的IO,系统调用与库函数. 1.初级IO函数:close,creat,lseek,open,write 文件描述符是一个整型数 1.1close 1.2int cr ...
- [HeadFist-HTMLCSS学习笔记][第四章Web镇之旅]
重要 访问一个目录,即是访问他的index <a>链接到网站,必须加http:// <a>的title属性,能预先知道链接信息 id属性 使得<a> 能再本地跳转. ...
- Linq:切勿使用 Count() > 0 来判断集合非空
原文(http://www.cnblogs.com/ldp615/archive/2011/12/11/2284154.html) Linq 出现之前,我们通常使用下面的方式来判断集合是否非空,即集合 ...
- Github错误:Failed to publish this branch
转自:http://jingpin.jikexueyuan.com/article/34632.html 今天弄github的时候,客户端一直出现error to publish this branc ...
- ie6+7+8等对background-color:rgba(),background-img渐变的兼容
一,ie8兼容rgba()的解决办法 今天遇到了一个问题,要在一个页面中设置一个半透明的白色div.这个貌似不是难题,只需要给这个div设置如下的属性即可: background: rgba(255, ...
- java final 和instanceof 关键字
/* final class A { public final void eat(){ System.out.println("测试"); } } */ class A { } c ...