簡(jiǎn)介
JConsole是一款基于JMX的可視化監(jiān)控和管理工具。
本文只介紹它的監(jiān)控功能,為了避免文字單一晦澀,C哥對(duì)每個(gè)知識(shí)點(diǎn)都有附上對(duì)應(yīng)的代碼示例。
1.啟動(dòng)JConsole
mac 在終端輸入jconsole即可。
windows 在cmd輸入jconsole或者找到Java安裝目錄下bin目錄下的jconsole.exe
【注】本文在Mac系統(tǒng)寫進(jìn)行演示。如圖1-1

從圖1-1中可以看出,C哥本地運(yùn)行的有Idea和jconsole兩個(gè)虛擬機(jī)進(jìn)程。
2.內(nèi)存監(jiān)控
Tab頁分為:概述、內(nèi)存、線程、類、VM概要、Mbean。

其中內(nèi)存頁的內(nèi)容相當(dāng)于可視化的jstat命令。
內(nèi)存監(jiān)控展示
首先編寫一個(gè)java程序,這個(gè)程序用來往java堆中填充數(shù)據(jù),我們來通過jconsole工具的內(nèi)存工具觀察內(nèi)存的變化。
示例代碼:作用以64K/50ms的速度往java堆里面填充數(shù)據(jù),一共填充1000次。
import java.util.List;
import java.util.ArrayList;
public class TestJconsoleHeap{
static class OOMObject{
public byte[] placeholder = new byte[64 * 1024];//一個(gè)對(duì)象為64K
}
public static void main(String[] args){
List<OOMObject> list = new ArrayList<>();
//添加1000次
for (int i = 0;i < 1000 ;i++ ) {
//稍作延遲,使得監(jiān)控曲線容易觀察
try{
Thread.sleep(50);
}catch(Exception e){
}
list.add(new OOMObject());
}
System.gc();
}
}
由于C哥是使用筆記本編寫大代碼,先使用javac編譯該代碼。
javac TestJconsoleHeap.java
然后運(yùn)行該程序,使用終端輸入:
java -Xms100M -Xmx100M -XX:useSerialGC TestJconsoleHeap
然后在啟動(dòng)界面,選擇:

觀察內(nèi)存監(jiān)控:(動(dòng)圖)

<article class="_2rhmJa">
可以觀察到Eden區(qū)域是折線狀。
3.線程監(jiān)控
線程監(jiān)控相當(dāng)于可視化的jstack,遇到線程停頓的時(shí)候,可以使用它來監(jiān)控。
線程長(zhǎng)時(shí)間停頓的主要原因:等待外部資源(數(shù)據(jù)庫連接、網(wǎng)絡(luò)資源、設(shè)備資源等)、死循環(huán)、鎖等待。
下面分別演示一下這幾種情況。