2008-09-16 11 views
86

मुझे जावा में सर्वर के लिए सीपीयू और मेमोरी उपयोग की जांच करने की ज़रूरत है, किसी को पता है कि यह कैसे किया जा सकता है?मैं जावा में सीपीयू और मेमोरी उपयोग कैसे जांचूं?

+1

[ओएस-स्तर प्राप्त करने के लिए जावा का उपयोग करने के लिए संभव डुप्लिकेट सिस्टम सूचना] (http://stackoverflow.com/questions/25552/using-java-to-get-os-level-system-Information) –

+0

शायद ये लिंक सहायक होंगे: http://www.javaworld.com/ जावावर्ल्ड/javaqa/2002-11/01-क्यूए-1108-cpu एचटीएमएल http://www.roseindia.net/javatutorials/determining_memory_usage_in_java.shtml – chessguy

उत्तर

1

यदि आप टोमकैट का उपयोग कर रहे हैं, तो Psi Probe देखें, जो आपको आंतरिक और बाहरी मेमोरी खपत के साथ-साथ कई अन्य क्षेत्रों की निगरानी करने देता है।

2

जावा की Runtime ऑब्जेक्ट JVM के मेमोरी उपयोग की रिपोर्ट कर सकता है। सीपीयू खपत के लिए आपको यूनिक्स के शीर्ष या विंडोज प्रोसेस मैनेजर जैसे बाहरी उपयोगिता का उपयोग करना होगा।

7

स्मृति के उपयोग के लिए, निम्न काम करेंगे,

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

CPU उपयोग के लिए, आप यह मापने के लिए एक बाहरी अनुप्रयोग का उपयोग करना होगा।

1

JConsole एक चल रहे जावा एप्लिकेशन की निगरानी करने का एक आसान तरीका है या आप अपने आवेदन पर अधिक विस्तृत जानकारी प्राप्त करने के लिए एक प्रोफाइलर का उपयोग कर सकते हैं। मुझे इसके लिए NetBeans Profiler का उपयोग करना पसंद है।

4

यदि आप रनटाइम/कुल मेमरी समाधान का उपयोग करते हैं जो कि कई उत्तरों में पोस्ट किया गया है (मैंने इसे बहुत कुछ किया है), तो सुनिश्चित करें कि आप दो कचरा संग्रहों को पहले मजबूर करना चाहते हैं यदि आप काफी सटीक/लगातार परिणाम चाहते हैं।

दक्षता के लिए जावा आमतौर पर जीसी को मजबूर करने से पहले सभी मेमोरी भरने के लिए कचरे की अनुमति देता है, और फिर भी यह आमतौर पर एक पूर्ण जीसी नहीं होता है, इसलिए रनटाइम के लिए आपके परिणाम। फ्रीमेमरी() हमेशा "वास्तविक" राशि के बीच कहीं होते हैं मुफ्त मेमोरी और 0.

पहला जीसी सबकुछ नहीं मिलता है, इसे अधिकतर मिलता है।

उछाल यह है कि यदि आप केवल फ्रीमेमरी() कॉल करते हैं तो आपको एक संख्या मिल जाएगी जो पूरी तरह बेकार है और व्यापक रूप से भिन्न होती है, लेकिन यदि 2 जीसी की पहली बार यह एक बहुत ही विश्वसनीय गेज है। यह नियमित रूप से बहुत धीमा (सेकंड, संभवतः) बनाता है।

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

तो अगर मैं ग्रहण में भाग रहा हूं, तो यह मेरी ग्रहण सेटिंग्स पर निर्भर करेगा? – Coffee

+1

हां, यह सही है – Jeremy

+2

ध्यान दें कि यह वास्तविक उपयोग की गई स्मृति नहीं है- यह 'आवंटित स्मृति' है जिसका अर्थ है कि जावा ने आवंटित किया है, इसलिए यदि आपके पास -Xms90g है और आपका ऐप बहुत हल्का है, तो भी आप 90g से अधिक कुछ के रूप में आवंटित स्मृति। नीचे हटाए गए "अज्ञात (याहू)" द्वारा उत्तर देखें (जो पहली नज़र में अलग हो सकता है) – 0fnt

4

जावा 1.5 के बाद से JDK एक नया उपकरण के साथ आता है: JConsole जो आपको किसी भी 1.5 या बाद के जेवीएम के सीपीयू और मेमोरी उपयोग दिखा सकता है। यह इन पैरामीटर के चार्ट कर सकता है, सीएसवी को निर्यात कर सकता है, लोड किए गए वर्गों की संख्या दिखा सकता है, उदाहरणों की संख्या, डेडलॉक्स, धागे इत्यादि ...

1

YourKit जावा प्रोफाइलर एक उत्कृष्ट वाणिज्यिक समाधान है। आप CPU profiling और memory profiling पर दस्तावेज़ों में और जानकारी प्राप्त कर सकते हैं।

9

जेएमएक्स, एमएक्सबीन (थ्रेडएमएक्सबीन, इत्यादि) प्रदान की गई आपको मेमोरी और सीपीयू उपयोग प्रदान करेगी।

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

आप सूर्य JVM उपयोग कर रहे हैं, और आवेदन (कितना आबंटित स्मृति आपके एप्लिकेशन का उपयोग किया जाता है में से) मैं JVMs निर्मित कचरा चालू करने के लिए पसंद करते हैं के आंतरिक स्मृति के उपयोग में रुचि रखते हैं संग्रह लॉगिंग। आप बस -verbose जोड़ें: स्टार्टअप कमांड के लिए जीसी।

सूर्य प्रलेखन से:

कमांड लाइन तर्क -verbose: हर संग्रह में जीसी प्रिंट जानकारी। ध्यान दें कि -verbose का प्रारूप: जे 2 आउटपुट जे 2 एसई मंच के रिलीज के बीच बदलने के लिए विषय है।

[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

ग्रहण के लिए, आप उपयोग कर सकते हैं 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); 
+0

और स्मृति के बारे में? –

+1

सूची memoryPools = new ArrayList (ManagementFactory.getMemoryPoolMXBeans()); लंबे समय तक इस्तेमाल किया गया हैपैममोरीएफ्टरलास्टजीसी = 0; के लिए (MemoryPoolMXBean memoryPool: memoryPools) { अगर (। memoryPool.getType() बराबर (MemoryType.HEAP)) { MemoryUsage poolCollectionMemoryUsage = memoryPool.getCollectionUsage(); usedHeapMemoryAfterLastGC + = poolCollectionMemoryUsage.getUsed(); } } – danieln

+1

सीपीयू उपयोग पुनर्प्राप्ति दिखाने वाले एकमात्र उत्तर के लिए धन्यवाद। – Matthieu

2

से मैं भी सीपीयू लोड ट्रैक करने के लिए नीचे दिए तरीक़े जोड़ना होगा:

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

संबंधित मुद्दे