2010-03-23 12 views
11

का उपयोग कर रहा है जावा वर्चुअल मशीन कई कचरा संग्रहण रणनीतियों का समर्थन करता है।मैं कैसे देख सकता हूं कि कौन सा कचरा कलेक्टर जावा

यह article उन्हें बताता है।

अब मैं सोच रहा हूं कि मेरा एप्लिकेशन किस प्रकार (स्वचालित रूप से चयनित) रणनीति का उपयोग कर रहा है, क्या JVM (संस्करण 1.6) इस जानकारी को प्रिंट करने का कोई तरीका है?

संपादित करें: JVM पता लगाता है कि यह क्लाइंट या सर्वर मोड में है या नहीं। तो सवाल वास्तव में यह है कि मैं कैसे देख सकता हूं कि कौन सा पता चला है?

+2

ध्यान दें कि के बारे में लेख वार्ता ** सूर्य से एक विशिष्ट कार्यान्वयन ** (विशेष रूप से हॉटस्पॉट JVM JRE)। –

+0

हाँ आप सही हैं। – Thirler

+0

कृपया ध्यान दें कि आप केवल एक जीसी का उपयोग नहीं कर रहे हैं। आपके पास आम तौर पर विभिन्न क्षेत्रों के लिए अलग-अलग रणनीतियां होती हैं। यदि आप सीएमएस का उपयोग करते हैं तो मुझे लगता है कि डिफ़ॉल्ट क्षेत्र के लिए "नया समांतर" उपयोग करना डिफ़ॉल्ट है। – Fredrik

उत्तर

13

http://java.sun.com/j2se/1.5.0/docs/guide/vm/gc-ergonomics.html जो J2SE 6 के लिए लागू है और साथ ही कहा गया है कि डिफ़ॉल्ट समानांतर कलेक्टर है।

हम केवल

-server -Xms3g -Xmx3g -XX:PermSize=128m -XX:LargePageSizeInBytes=4m -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 

स्थापना करके एक JVM 1.5 पर एक बार इस परीक्षण किया है और उत्पादन

 
41359.597: [GC [PSYoungGen: 90499K->32K(377344K)] 268466K->181862K(2474496K), 0.0183138 secs] 
41359.615: [Full GC [PSYoungGen: 32K->0K(377344K)] [PSOldGen: 181830K->129760K(2097152K)] 181862K->129760K(2474496K) [PSPermGen: 115335K->115335K(131072K)], 4.4590942 secs] 

जहां पुनश्च समानांतर सफाई के लिए खड़ा है

0

-verbose द्वारा प्रदान की गई जानकारी के बारे में क्या: gc और -XX: + PrintGCDetails कमांड लाइन विकल्प? क्या यह सहायक नहीं है?

[संपादित करें: जाहिर नहीं]

+0

यह मुद्रित नहीं करता कि कौन सा कचरा कलेक्टर इस्तेमाल किया जा रहा है। – Thirler

4

के रूप में जोआचिम पहले ही बताया, पता चला लेख जिसका आप उल्लेख करते हैं, सूर्य के वीएम द्वारा दी गई वीएम रणनीतियों का वर्णन करता है। वीएम विनिर्देश स्वयं विशिष्ट जीसी एल्गोरिदम को अनिवार्य नहीं करता है और इसलिए यह समझ में नहीं आता है उदा। एपीआई में इनके लिए गणना मूल्य।

आप फिर भी कुछ infos प्रबंधन API से प्राप्त कर सकते हैं: इन सेम के माध्यम से,

List<GarbageCollectorMXBean> beans = 
    ManagementFactory.getGarbageCollectorMXBeans(); 

पुनरावृत्ति आप जी सी के नाम प्राप्त कर सकते हैं (हालांकि केवल एक स्ट्रिंग के रूप में) और स्मृति पूल के नाम, जो विभिन्न जीसी द्वारा प्रबंधित किया जाता है।

13

jmap -heap

एक ढेर सारांश प्रिंट करता है। जीसी एल्गोरिदम का उपयोग किया जाता है, ढेर विन्यास और पीढ़ी के ढेर उपयोग मुद्रित होते हैं।

http://java.sun.com/javase/6/docs/technotes/tools/share/jmap.html

+0

यह वही है जो मुझे चाहिए, दुर्भाग्य से यह विंडोज़ पर उपलब्ध नहीं है (हालांकि कोई संकेत नहीं है)। – Thirler

+0

शायद आपको उस जानकारी (विंडोज) को प्रश्न में जोड़ना चाहिए;) – fglez

7

JAVA_OPTS में इस रखो:

-XX:+UseSerialGC -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps 

UseSerialGC के लिए हम लॉग में देखेंगे:

7.732: [GC 7.732: [DefNew: 419456K->47174K(471872K), 0.1321800 secs] 419456K->47174K(1520448K), 0.1322500 secs] [Times: user=0.10 sys=0.03, real=0.14 secs] 

UseConcMarkSweepGC के लिए हम में देखेंगे लॉग:

5.630: [GC 5.630: ['ParNew: 37915K->3941K(38336K), 0.secs] 78169K->45163K(1568640K), 0.0124030 secs] [Times: user=0.02 sys=0.00, real=0.01 secs] 

UseParallelGC हम लॉग में देखेंगे के लिए:

30.250: [GC [PSYoungGen: 441062K->65524K(458752K)] 441062K->76129K(1507328K), 0.1870880 secs] [Times: user=0.33 sys=0.03, real=0.19 secs] 
1

आप सरल प ¤ लिख सकते हैं जो आपके जावा प्रक्रिया के लिए JMX के माध्यम से जोड़ता है:

public class PrintJMX { 
    public static void main(String[] args) throws Exception { 
    String rmiHostname = "localhost"; 
    String defaultUrl = "service:jmx:rmi:///jndi/rmi://" + rmiHostname + ":1099/jmxrmi"; 
    JMXServiceURL jmxServiceURL = new JMXServiceURL(defaultUrl); 

    JMXConnector jmxConnector = JMXConnectorFactory.connect(jmxServiceURL); 
    MBeanServerConnection mbsc = jmxConnector.getMBeanServerConnection(); 


    ObjectName gcName = new ObjectName(ManagementFactory.GARBAGE_COLLECTOR_MXBEAN_DOMAIN_TYPE + ",*"); 

    for (ObjectName name : mbsc.queryNames(gcName, null)) { 
     GarbageCollectorMXBean gc = ManagementFactory.newPlatformMXBeanProxy(mbsc, 
     name.getCanonicalName(), 
     GarbageCollectorMXBean.class); 

     System.out.println(gc.getName()); 
    } 

    } 
} 
4

की तरह, लगता है हम रनटाइम पर GC के संस्करण को परिभाषित करने के लिए अधिक सुविधाजनक तरीका है। हमेशा उपकरण, मेरे सुझाव का प्रयोग करें। जीसी संस्करण परिभाषित करने के लिए हमारे पास दो उपकरण है कि JVM के साथ आते हैं की जरूरत है (आपके jdk/bin निर्देशिका में रखा):

  1. VisualVM - यह शुरू करने और कुछ प्रक्रिया प्रोफ़ाइल (उदाहरण के लिए आप VisualVM खुद प्रोफ़ाइल कर सकते हैं) की कोशिश करो। आपकी प्रोफ़ाइल आपको प्रक्रिया के पीआईडी ​​ दिखाएगी (स्क्रीनशॉट पर हरे रंग के आयतों को देखें)।
  2. jMap - -heap <PID> विकल्पों के साथ इस उपकरण शुरू करने और एक स्ट्रिंग एक कचरा कलेक्टर प्रकार के लिए समर्पित लगता है (एक स्क्रीनशॉट पर एक गुलाबी लाइन को देखने)

enter image description here

1
इस पाने के लिए

सबसे अच्छा तरीका है: जाओ लाइन कमांड करने के लिए और निम्न आदेश दर्ज करें।

जावा -XX: + PrintCommandLineFlags -संस्करण

यह आप परिणाम दिखा देंगे की तरह:

C:\windows\system32>java -XX:+PrintCommandLineFlags -version 
-XX:InitialHeapSize=132968640 -XX:MaxHeapSize=2127498240 -XX:+PrintCommandLineFl 
ags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesInd 
**ividualAllocation -XX:+UseParallelGC** 
java version "1.8.0_66" 
Java(TM) SE Runtime Environment (build 1.8.0_66-b17) 
Java HotSpot(TM) 64-Bit Server VM (build 25.66-b17, mixed mode)`enter code here` 
संबंधित मुद्दे