2008-09-16 124 views
86

我需要在java中檢查服務器的CPU和內存使用情況,任何人都知道它可以做什麼?如何在Java中檢查CPU和內存使用情況?

+1

[使用Java來獲得操作系統級的可能重複系統信息](http://stackoverflow.com/questions/25552/using-java-to-get-os-level-system-information) – 2012-04-25 19:41:36

+0

也許這些鏈接將有所幫助:http://www.javaworld.com/和javaworld/javaqa/2002-11/01-QA-1108-CPU .html http://www.roseindia.net/javatutorials/determining_memory_usage_in_java.shtml – chessguy 2008-09-16 17:19:18

回答

1

如果您使用的是Tomcat,請Psi Probe,它可以讓你監控內部和外部存儲器的消耗,以及其他領域的主機。

2

Java的Runtime對象可以報告JVM的內存使用情況。對於CPU消耗,您必須使用外部實用程序,如Unix的頂層或Windows進程管理器。

7

對於內存的使用,下面的工作,

long total = Runtime.getRuntime().totalMemory(); 
long used = Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); 

CPU使用率,你需要使用一個外部應用程序來衡量它。

1

JConsole是監視正在運行的Java應用程序,一個簡單的方法,也可以使用Profiler來得到你的應用程序的更多詳細信息。我喜歡用這個NetBeans Profiler

4

如果您使用的是已被張貼在許多答案,這裏的運行時間/ totalMemory解決方案(我已經做了很多),請務必先強行使兩個垃圾收集,如果你想相當準確的/一致的結果。

對於效率芻議Java的通常允許強制GC之前的垃圾填滿了所有的記憶,即使如此,它通常不是一個完整的GC,所以你的結果runtime.freeMemory()始終是「真正」的量之間的某處可用內存和0

第一GC沒有得到一切,它得到大部分。

上升是,如果你只是做freeMemory()調用,你會得到一個絕對無用的數字,並且變化很大,但如果做2 gc的話,它是一個非常可靠的量表。它也會使例行程序更慢(可能是秒)。

64

如果你專門爲JVM內存尋找:

Runtime runtime = Runtime.getRuntime(); 

NumberFormat format = NumberFormat.getInstance(); 

StringBuilder sb = new StringBuilder(); 
long maxMemory = runtime.maxMemory(); 
long allocatedMemory = runtime.totalMemory(); 
long freeMemory = runtime.freeMemory(); 

sb.append("free memory: " + format.format(freeMemory/1024) + "<br/>"); 
sb.append("allocated memory: " + format.format(allocatedMemory/1024) + "<br/>"); 
sb.append("max memory: " + format.format(maxMemory/1024) + "<br/>"); 
sb.append("total free memory: " + format.format((freeMemory + (maxMemory - allocatedMemory))/1024) + "<br/>"); 

然而,這些應採取只有一個估計...

+0

所以如果我在Eclipse中運行,這將取決於我的Eclipse設置? – Coffee 2013-03-01 02:08:38

4

由於Java 1.5的JDK配備了一個新的工具:JConsole至極可以顯示任何1.5或更高版本JVM的CPU和內存使用情況。它可以執行這些參數的圖表,導出爲CSV,顯示加載的類的數量,實例的數量,死鎖,線程等等...

9

JMX,提供的MXBean(ThreadMXBean的,等等)會給你內存與CPU佔用率。

OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); 
operatingSystemMXBean.getSystemCpuLoad(); 
16

如果您使用的是Sun JVM,並有興趣在應用程序(多少您的應用的使用分配的內存),我喜歡打開的JVM內置垃圾的內存使用情況收集日誌。您只需將-verbose:gc添加到啓動命令。

從Sun文檔:

命令行參數-verbose:在每一個 收集GC打印信息。請注意,-verbose:gc輸出的格式會在J2SE平臺的發行版之間發生變化,主題爲 。例如,這裏是一個大型的服務器應用程序 輸出:

[GC 325407K->83000K(776768K), 0.2300771 secs] 
[GC 325816K->83372K(776768K), 0.2454258 secs] 
[Full GC 267628K->83769K(776768K), 1.8479984 secs] 

這裏我們可以看到兩個小集合和一個主要的一個。數字 前後箭頭

325407K->83000K (in the first line) 

後表示活動對象的總大小之前和垃圾收集 後,分別。未成年人集合後,計數包括 對象不一定是活着,但不能被回收,要麼 因爲他們是直接活着,還是因爲他們是內部或 從年老代引用。括號

(776768K) (in the first line) 

數量是總的可用空間,而不是在永久 一代,這是總堆減去生存空間的一個計算的空間。 小型收藏大約需要四分之一秒。

0.2300771 secs (in the first line) 

欲瞭解更多信息,請參閱:http://java.sun.com/docs/hotspot/gc5.0/gc_tuning_5.html

3

下面是一些簡單的代碼來計算兆內存的使用:

double currentMemory = ((double)((double)(Runtime.getRuntime().totalMemory()/1024)/1024))- ((double)((double)(Runtime.getRuntime().freeMemory()/1024)/1024)); 
0

對於Eclipse,你可以使用TPTP(測試和性能工具平臺),用於分析內存使用情況等more information

17
package mkd.Utils; 

import java.io.File; 
import java.text.NumberFormat; 

public class systemInfo { 

    private Runtime runtime = Runtime.getRuntime(); 

    public String Info() { 
     StringBuilder sb = new StringBuilder(); 
     sb.append(this.OsInfo()); 
     sb.append(this.MemInfo()); 
     sb.append(this.DiskInfo()); 
     return sb.toString(); 
    } 

    public String OSname() { 
     return System.getProperty("os.name"); 
    } 

    public String OSversion() { 
     return System.getProperty("os.version"); 
    } 

    public String OsArch() { 
     return System.getProperty("os.arch"); 
    } 

    public long totalMem() { 
     return Runtime.getRuntime().totalMemory(); 
    } 

    public long usedMem() { 
     return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory(); 
    } 

    public String MemInfo() { 
     NumberFormat format = NumberFormat.getInstance(); 
     StringBuilder sb = new StringBuilder(); 
     long maxMemory = runtime.maxMemory(); 
     long allocatedMemory = runtime.totalMemory(); 
     long freeMemory = runtime.freeMemory(); 
     sb.append("Free memory: "); 
     sb.append(format.format(freeMemory/1024)); 
     sb.append("<br/>"); 
     sb.append("Allocated memory: "); 
     sb.append(format.format(allocatedMemory/1024)); 
     sb.append("<br/>"); 
     sb.append("Max memory: "); 
     sb.append(format.format(maxMemory/1024)); 
     sb.append("<br/>"); 
     sb.append("Total free memory: "); 
     sb.append(format.format((freeMemory + (maxMemory - allocatedMemory))/1024)); 
     sb.append("<br/>"); 
     return sb.toString(); 

    } 

    public String OsInfo() { 
     StringBuilder sb = new StringBuilder(); 
     sb.append("OS: "); 
     sb.append(this.OSname()); 
     sb.append("<br/>"); 
     sb.append("Version: "); 
     sb.append(this.OSversion()); 
     sb.append("<br/>"); 
     sb.append(": "); 
     sb.append(this.OsArch()); 
     sb.append("<br/>"); 
     sb.append("Available processors (cores): "); 
     sb.append(runtime.availableProcessors()); 
     sb.append("<br/>"); 
     return sb.toString(); 
    } 

    public String DiskInfo() { 
     /* Get a list of all filesystem roots on this system */ 
     File[] roots = File.listRoots(); 
     StringBuilder sb = new StringBuilder(); 

     /* For each filesystem root, print some info */ 
     for (File root : roots) { 
      sb.append("File system root: "); 
      sb.append(root.getAbsolutePath()); 
      sb.append("<br/>"); 
      sb.append("Total space (bytes): "); 
      sb.append(root.getTotalSpace()); 
      sb.append("<br/>"); 
      sb.append("Free space (bytes): "); 
      sb.append(root.getFreeSpace()); 
      sb.append("<br/>"); 
      sb.append("Usable space (bytes): "); 
      sb.append(root.getUsableSpace()); 
      sb.append("<br/>"); 
     } 
     return sb.toString(); 
    } 
} 
14

here

OperatingSystemMXBean operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); 
    RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean(); 
    int availableProcessors = operatingSystemMXBean.getAvailableProcessors(); 
    long prevUpTime = runtimeMXBean.getUptime(); 
    long prevProcessCpuTime = operatingSystemMXBean.getProcessCpuTime(); 
    double cpuUsage; 
    try 
    { 
     Thread.sleep(500); 
    } 
    catch (Exception ignored) { } 

    operatingSystemMXBean = (OperatingSystemMXBean) ManagementFactory.getOperatingSystemMXBean(); 
    long upTime = runtimeMXBean.getUptime(); 
    long processCpuTime = operatingSystemMXBean.getProcessCpuTime(); 
    long elapsedCpu = processCpuTime - prevProcessCpuTime; 
    long elapsedTime = upTime - prevUpTime; 

    cpuUsage = Math.min(99F, elapsedCpu/(elapsedTime * 10000F * availableProcessors)); 
    System.out.println("Java CPU: " + cpuUsage); 
2

我還要補充以下的方法來跟蹤CPU負載:

import java.lang.management.ManagementFactory; 
import com.sun.management.OperatingSystemMXBean; 

double getCpuLoad() { 
    OperatingSystemMXBean osBean = 
     (com.sun.management.OperatingSystemMXBean) ManagementFactory. 
     getPlatformMXBeans(OperatingSystemMXBean.class); 
    return osBean.getProcessCpuLoad(); 
} 

你可以閱讀更多here

相關問題