[转]java取得Linuxcpu,内存,磁盘实时信息
生活随笔
收集整理的這篇文章主要介紹了
[转]java取得Linuxcpu,内存,磁盘实时信息
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
java取得Linuxcpu,內存,磁盤實時信息
Java代碼import java.io.BufferedReader;??
import java.io.File;??
import java.io.FileInputStream;??
import java.io.IOException;??
import java.io.InputStreamReader;??
import java.util.StringTokenizer;??
?
/**?
* 取得linux系統下的cpu、內存信息?
*??
* */?
public final class LinuxSystemTool??
{??
?? /**?
?? * get memory by used info?
?? *??
?? * @return int[] result?
?? * result.length==4;int[0]=MemTotal;int[1]=MemFree;int[2]=SwapTotal;int[3]=SwapFree;?
?? * @throws IOException?
?? * @throws InterruptedException?
?? */?
?? public static int[] getMemInfo() throws IOException, InterruptedException??
?? {??
????? File file = new File("/proc/meminfo");??
????? BufferedReader br = new BufferedReader(new InputStreamReader(??
????? new FileInputStream(file)));??
????? int[] result = new int[4];??
????? String str = null;??
????? StringTokenizer token = null;??
????? while((str = br.readLine()) != null)??
????? {??
???????? token = new StringTokenizer(str);??
???????? if(!token.hasMoreTokens())??
??????????? continue;??
?????
???????? str = token.nextToken();??
???????? if(!token.hasMoreTokens())??
??????????? continue;??
?????
???????? if(str.equalsIgnoreCase("MemTotal:"))??
??????????? result[0] = Integer.parseInt(token.nextToken());??
???????? else if(str.equalsIgnoreCase("MemFree:"))??
??????????? result[1] = Integer.parseInt(token.nextToken());??
???????? else if(str.equalsIgnoreCase("SwapTotal:"))??
??????????? result[2] = Integer.parseInt(token.nextToken());??
???????? else if(str.equalsIgnoreCase("SwapFree:"))??
??????????? result[3] = Integer.parseInt(token.nextToken());??
????? }??
?????
????? return result;??
?? }??
?
?? /**?
?? * get memory by used info?
?? *??
?? * @return float efficiency?
?? * @throws IOException?
?? * @throws InterruptedException?
?? */?
?? public static float getCpuInfo() throws IOException, InterruptedException??
?? {??
????? File file = new File("/proc/stat");??
????? BufferedReader br = new BufferedReader(new InputStreamReader(??
????? new FileInputStream(file)));??
????? StringTokenizer token = new StringTokenizer(br.readLine());??
????? token.nextToken();??
????? int user1 = Integer.parseInt(token.nextToken());??
????? int nice1 = Integer.parseInt(token.nextToken());??
????? int sys1 = Integer.parseInt(token.nextToken());??
????? int idle1 = Integer.parseInt(token.nextToken());??
?????
????? Thread.sleep(1000);??
?
????? br = new BufferedReader(??
????? new InputStreamReader(new FileInputStream(file)));??
????? token = new StringTokenizer(br.readLine());??
????? token.nextToken();??
????? int user2 = Integer.parseInt(token.nextToken());??
????? int nice2 = Integer.parseInt(token.nextToken());??
????? int sys2 = Integer.parseInt(token.nextToken());??
????? int idle2 = Integer.parseInt(token.nextToken());??
?
????? return (float)((user2 + sys2 + nice2) - (user1 + sys1 + nice1)) / (float)((user2 + nice2 + sys2 + idle2) - (user1 + nice1 + sys1 + idle1));??
?? }??
}??
?
/**?
* 測試類?
*??
* <p>@author javer QQ:84831612</p>?
* @date 2005?
*/?
public class JaverTest??
{??
??? public static void main(String[] args) throws Exception??
??? {??
??????? int[] memInfo = LinuxSystemTool.getMemInfo();??
??????? System.out.println("MemTotal:" + memInfo[0]);??
??????? System.out.println("MemFree:" + memInfo[1]);??
??????? System.out.println("SwapTotal:" + memInfo[2]);??
??????? System.out.println("SwapFree:" + memInfo[3]);??
?
??????? System.out.println("CPU利用率:" + LinuxSystemTool.getCpuInfo());??
??? }??
}?
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
/**
* 取得linux系統下的cpu、內存信息
*
* */
public final class LinuxSystemTool
{
?? /**
?? * get memory by used info
?? *
?? * @return int[] result
?? * result.length==4;int[0]=MemTotal;int[1]=MemFree;int[2]=SwapTotal;int[3]=SwapFree;
?? * @throws IOException
?? * @throws InterruptedException
?? */
?? public static int[] getMemInfo() throws IOException, InterruptedException
?? {
????? File file = new File("/proc/meminfo");
????? BufferedReader br = new BufferedReader(new InputStreamReader(
????? new FileInputStream(file)));
????? int[] result = new int[4];
????? String str = null;
????? StringTokenizer token = null;
????? while((str = br.readLine()) != null)
????? {
???????? token = new StringTokenizer(str);
???????? if(!token.hasMoreTokens())
??????????? continue;
??
???????? str = token.nextToken();
???????? if(!token.hasMoreTokens())
??????????? continue;
??
???????? if(str.equalsIgnoreCase("MemTotal:"))
??????????? result[0] = Integer.parseInt(token.nextToken());
???????? else if(str.equalsIgnoreCase("MemFree:"))
??????????? result[1] = Integer.parseInt(token.nextToken());
???????? else if(str.equalsIgnoreCase("SwapTotal:"))
??????????? result[2] = Integer.parseInt(token.nextToken());
???????? else if(str.equalsIgnoreCase("SwapFree:"))
??????????? result[3] = Integer.parseInt(token.nextToken());
????? }
??
????? return result;
?? }
?? /**
?? * get memory by used info
?? *
?? * @return float efficiency
?? * @throws IOException
?? * @throws InterruptedException
?? */
?? public static float getCpuInfo() throws IOException, InterruptedException
?? {
????? File file = new File("/proc/stat");
????? BufferedReader br = new BufferedReader(new InputStreamReader(
????? new FileInputStream(file)));
????? StringTokenizer token = new StringTokenizer(br.readLine());
????? token.nextToken();
????? int user1 = Integer.parseInt(token.nextToken());
????? int nice1 = Integer.parseInt(token.nextToken());
????? int sys1 = Integer.parseInt(token.nextToken());
????? int idle1 = Integer.parseInt(token.nextToken());
??
????? Thread.sleep(1000);
????? br = new BufferedReader(
????? new InputStreamReader(new FileInputStream(file)));
????? token = new StringTokenizer(br.readLine());
????? token.nextToken();
????? int user2 = Integer.parseInt(token.nextToken());
????? int nice2 = Integer.parseInt(token.nextToken());
????? int sys2 = Integer.parseInt(token.nextToken());
????? int idle2 = Integer.parseInt(token.nextToken());
????? return (float)((user2 + sys2 + nice2) - (user1 + sys1 + nice1)) / (float)((user2 + nice2 + sys2 + idle2) - (user1 + nice1 + sys1 + idle1));
?? }
}
/**
* 測試類
*
* <p>@author javer QQ:84831612</p>
* @date 2005
*/
public class JaverTest
{
??? public static void main(String[] args) throws Exception
??? {
??????? int[] memInfo = LinuxSystemTool.getMemInfo();
??????? System.out.println("MemTotal:" + memInfo[0]);
??????? System.out.println("MemFree:" + memInfo[1]);
??????? System.out.println("SwapTotal:" + memInfo[2]);
??????? System.out.println("SwapFree:" + memInfo[3]);
??????? System.out.println("CPU利用率:" + LinuxSystemTool.getCpuInfo());
??? }
} (http://people.ee.ethz.ch/~oetiker/webtools/mrtg/)就是一個很不錯的選擇。不過用mrtg就要裝sysstat、apache、snmp、perl之類的東西。而且安裝也要好幾個步驟,似乎比較麻煩。本來也想直接調用sar、vmstat之類的命令,parse一下結果就算了。哪知道發現不同的版本的linux這些命令的結果也都是不一樣。既然要按版本 parse它們的結果,那還不如直接去系統里面獲得算了。于是研究了一下sysstat(http://freshmeat.net/projects/sysstat/)和gkrellm(http://gkrellm.net )的源代碼,找到監測性能的數據所在。
1、CPU
在文件"/proc/stat"里面就包含了CPU的信息。每一個CPU的每一tick用在什么地方都在這個文件里面記著。后面的數字含義分別是: user、nice、sys、idle、iowait。有些版本的kernel沒有iowait這一項。這些數值表示從開機到現在,CPU的每tick用在了哪里。例如:
cpu0 256279030 0 11832528 1637168262
就是cpu0從開機到現在有 256279030 tick用在了user消耗,11832528用在了sys消耗。所以如果想計算單位時間(例如1s)里面CPU的負載,那只需要計算1秒前后數值的差除以每一秒的tick數量就可以了。gkrellm就是這樣實現的:((200 * (v2 - v1) / CPU_TICKS_PER_SECOND) + 1) /2
例如,第一次讀取/proc/stat,user的值是256279030;一秒以后再讀一次,值是256289030,那么CPU在這一秒的user消耗就是:((200 * (256289030 - 256279030) / CPU_TICKS_PER_SECOND) + 1) /2 = ((10000 * 200 / 1000000) + 1) / 2 = 1%了。
2、內存消耗
文件"/proc/meminfo"里面包含的就是內存的信息,還包括了swap的信息。例如:
$ cat /proc/meminfo
total:??? used:??? free:? shared: buffers:? cached:
Mem:? 1057009664 851668992 205340672??????? 0 67616768 367820800
Swap: 2146787328 164429824 1982357504
MemTotal:????? 1032236 kB
MemFree:??????? 200528 kB
MemShared:?????????? 0 kB
……
不過從gkrellm的源代碼看,有些版本沒有前面那兩行統計的信息,只能夠根據下面的Key: Value這種各式的數據收集。
3、磁盤空間
從gkrellm的源代碼看,這個是一個很復雜的數據。磁盤分區的數據有可能分布在:/proc/mounts、/proc/diskstats、 /proc/partitions等等。而且如果想要檢查某幾個特定的路徑,還需要通過mount、df等命令的幫助。為了減少麻煩,這個數據我就直接用 statfs函數直接獲得了。
int statfs(const char *path, struct statfs *buf);
這個函數只需要輸入需要檢查的路徑名稱,就可以返回這個路徑所在的分區的空間使用情況:
總空間:buf.f_bsize * buf.f_blocks
空余空間:buf.f_bsize * buf.f_bavail
4、磁盤I/O
磁盤I/O的數據也同樣比較復雜,有些版本看/proc/diskstats,有些版本看/proc/partitions,還有些版本至今我也不知道在那里看……不過可以看到數據的版本也像CPU那樣,需要隔一段時間取值,兩次取值的差就是流量。
5、網絡流量
網絡流量也是五花八門,不過基本上都可以在/proc/net/dev里面獲得。同樣也是需要兩次取值取其差作為流量值。
Linux聯盟收集整理 ,轉貼請標明原始鏈接,如有任何疑問歡迎來本站Linux論壇討論
轉載于:https://www.cnblogs.com/beyondwcm/archive/2008/09/22/1296174.html
總結
以上是生活随笔為你收集整理的[转]java取得Linuxcpu,内存,磁盘实时信息的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DbHelper数据操作类,DbProv
- 下一篇: 简易而又灵活的Javascript拖拽框