代碼分析也無需事無巨細皆列而剖之,只要找到關鍵所在也就是了;又不然列一堆的聲明上來,縱然有人有耐心看下去,我也沒耐心寫下去啊。特別關注了三 個類,Stats、MonitorPerformancePanel、MonitorGraph。分別是獲取解析得到的數據、監控器面板顯示和監視器上的 圖像繪制。下面選取了一些關鍵代碼來進行分析:
首先是Stats.java,下面是計算內存使用率的方法
public static int calculateMemoryLoad(Status stat) {
double load = 0;
if (stat != null) {
double total = stat.getJvm().getMemory().getTotal();
double free = stat.getJvm().getMemory().getFree();
double used = total - free;
load = (used / total);
}
return (int) (load * 100);
}
很簡單吧?就是獲取total值和free值,然后計算內存使用率,那么它解析的是什么東西呢?我們取了一份tomcat上的status的xml,內容如下:
<?xml version="1.0" encoding="utf-8"?><status><jvm><memory free='937000' total='5177344' max='66650112'/></jvm><connector name='http-8080'><threadInfo maxThreads="40" currentThreadCount="2" currentThreadsBusy="1" /><requestInfo maxTime="1715" processingTime="2819" requestCount="20" errorCount="2" bytesReceived="0" bytesSent="108662" /><workers><worker stage="S" requestProcessingTime="0" requestBytesSent="0" requestBytesReceived="0" remoteAddr="127.0.0.1" virtualHost="localhost" method="GET" currentUri="/manager/status" currentQueryString="XML=true" protocol="HTTP/1.1" /><worker stage="R" requestProcessingTime="0" requestBytesSent="0" requestBytesRecieved="0" remoteAddr="?" virtualHost="?" method="?" currentUri="?" currentQueryString="?" protocol="?" /></workers></connector><connector name='jk-8009'><threadInfo maxThreads="200" currentThreadCount="4" currentThreadsBusy="1" /><requestInfo maxTime="0" processingTime="0" requestCount="0" errorCount="0" bytesReceived="0" bytesSent="0" /><workers></workers></connector></status>
這亂七八糟的,誰看得清啊,不要急,保存下來命名為.xml文件,扔到ie里再看一下

其實上面那段代碼所取的,就是這個xml里面的memory free和total。
這 個xml里這么多可以利用的內容,要是我們都解析出來,不就可以有很多資源數據了?有人也許會問,這些都是什么tread信息什么,又沒有cpu啊,io 之類的信息,解析出來也沒用;要知道,這個xml文件你自己可以生成的,里面存什么數據,你自己怎么定義都行啊,定義好了,寫一個動態更新這里面的數據的 腳本或程序,再利用web去展現這個xml,jmeter不就可以取來用了?
我們再看看MonitorPerformancePanel.java
public static final String LEGEND_MEM = JMeterUtils.getResString("monitor_legend_memory_per"); //$NON-NLS-1$
public static final ImageIcon LEGEND_MEM_ICON = JMeterUtils.getImage("monitor-orange-legend.gif"); //$NON-NLS-1$
這兩句就是設置監視器上顯示的圖例,是啥東西呢?就是這個:

標識了圖線的顏色和內容標簽
上面兩句設置好了,要顯示就要看下面這段的了:
JLabel mem = new JLabel(LEGEND_MEM);
mem.setFont(plaintext);
mem.setPreferredSize(lsize);
mem.setIcon(LEGEND_MEM_ICON);
legend.add(mem);
做過java的gui編程的朋友一定不會覺得陌生,呵呵
再下來看一下MonitorGraph.java
if (MEM) {
int mmy = (int) (height - (height * (model.getMemload() / 10000.0)));
int lastmmy = (int) (height - (height * (last.getMemload() / 10000.0)));
g.setColor(Color.orange);
g.drawLine(lastx, lastmmy, xaxis, mmy);
}
這段就是展現曲線的代碼,可以產生如下的效果:

用jmeter做過tomcat監控的人一定會覺得很熟悉。不過也許會問,為啥這個圖像上曲線這么多呢,jmeter不是就四條么?
呵呵,不忙,且聽我慢慢道來。