Java与C++之间有一睹由内存动态分配和垃圾收集技术所围成的高墙,墙外面的人想进去,墙里面的人却想出来。
JConsole是一款基于JMX的可视化监视,管理工具。他的主要功能是通过JMX的MBean对系统进行信息收集和参数动态调整。
1.启动JConsole
通过JDK/bin目录下的jconsole.exe 启动JConsole,或者配置了环境变量,直接在控制台上面执行 jconsole命令就会自动启动工具。
选中本地进程,点击连接,不需要用户名和口令那个是远程进程才需要的
点击不安全连接就可以进入管理界面。
首页就可以看到有这几个,堆内存使用量,线程,类,cpu等一些信息,接下来我们写一段实例代码来看看:
2.内存监控
代码:
/**
* -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();
}
}
}
}
注意,配置好jvm堆内存参数配置:
这里就是可以看出堆的使用情况,以及各个分代执行的情况。
由于代码设置的jvm调优参数,在执行到一定情况后,会出oom的错误,这时候我们看看jconsole的图示:
3.线程监控:
死锁代码演示:
/**
* 演示线程的死锁问题
*
* @author shkstart
* @create 下午 3:20
*/
public class ThreadDeadLock {
public static void main(String[] args) {
StringBuilder s1 = new StringBuilder();
StringBuilder s2 = new StringBuilder();
new Thread(){
@Override
public 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() {
@Override
public 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();
}
}
执行代码,打开jconsole,连接进程id:
点击检测死锁的按钮,工具帮我们检测是否有死锁的情况,在程序中,如果有时候出现卡顿,停止不动的情况,就要看看是否有死锁来
由此可见程序中的死锁被检测出来了。我们可以根据上面的信息去调整自己的代码,
vm概要信息:
这些不就对应着jinfo命令吗,可查看jvm信息,工具都是基于jvm命令的。
好了jconsole就到这里了,有问题的朋友,请在下方讨论,一起学习。