2013-03-09 6 views
10

मैं jstat उपयोग कर रहा हूँ जी सी के संचालन के लिए कुल जमा समय प्राप्त करने के लिए, यानी GCTगणना

तो, मान GCT 2 सेकंड है, और मेरे JVM प्रक्रिया के लिए शुरू कर दिया 60 सेकंड, मैं तोड़ क्वाड कोर पर एक चल रहा हूँ, इसलिए जी सी के अपने%

2/60 * 4 = 0.83% 

सही ऊपर मेरी गणना है है?

उत्तर

3

नहीं, वास्तव में नहीं। आपकी गणना पूरे समय के दौरान जावा प्रक्रियाओं द्वारा सभी 4 कोरों का 100% उपयोग मानती है।

सही गणना (time spent in logic)/(time spent in gc) है लेकिन जानकारी के पहले भाग को आमतौर पर एक प्रोफाइलर की आवश्यकता होती है।

+0

यह समझ में आता है, लेकिन क्या jstat या अन्य उपकरणों का उपयोग करके 'तर्क में बिताए गए समय' के मूल्य को पुनः प्राप्त करना संभव है? धन्यवाद – Ryan

6

नहीं, आपकी गणना सटीक नहीं है, इस तरह, आपको सटीक समय पता नहीं है जिसके लिए ओएस ने आपके प्रोग्राम को चलाने की अनुमति दी है।

यह मानते हुए कि आप समय के लिए आवेदन पूरी तरह से जी सी ने रोक दिया पर विचार करना चाहते (समय थामने), तो आपको निम्न JVM विकल्पों का उपयोग कर सकते हैं:

-XX:+PrintGCApplicationConcurrentTime 
-XX:+PrintGCApplicationStoppedTime 

यह विकल्प JVM प्रिंट कुछ कर देगा इस तरह stdout करने के लिए:

Application time: 3.3319318 seconds 
Total time for which application threads were stopped: 0.7876304 seconds 
Application time: 2.1039898 seconds 
Total time for which application threads were stopped: 0.4100732 seconds 

इसके बाद आप बार जिसके लिए आवेदन रोक दिया गया योग और आवेदन समय का योग विराम समय से विभाजित mutator उपयोग (समय के अंश पाने के लिए कर सकते हैं, जिसमें आवेदन रोका नहीं गया था जीसी द्वारा)।

भी http://prefetch.net/blog/index.php/2008/02/18/measuring-the-time-an-application-was-stopped-due-to-garbage-collection/

+1

क्या आप जानते हैं कि उन तर्कों के लिए दस्तावेज़ कहां हैं? आवेदन समय दीवार समय या सीपीयू समय है? – radai

+0

@radai अच्छा सवाल - मुझे बिल्कुल यकीन नहीं है, लेकिन मैं इसे खोजने और उत्तर अपडेट करने का प्रयास करूंगा। –

1

PrintGCDetails देखें - इस विकल्प उपयोगी हो सकता है। यह हर कचरा संग्रह के बारे में जानकारी prins।

[GC 
[PSYoungGen: 99952K->14688K(109312K)] 
422212K->341136K(764672K), 0.0631991 secs] 
[Times: user=0.83 sys=0.00, real=0.06 secs] 

Pprovides CPU उपयोग और बीता हुआ समय जानकारी। उपयोगकर्ता के अधिकार का मान CPU समय है जो कचरा संग्रह द्वारा प्रयुक्त होता है ऑपरेटिंग सिस्टम के बाहर निर्देश। इस उदाहरण में, कचरा कलेक्टर उपयोगकर्ता CPU समय के 0.06 सेकंड का उपयोग करता था। का मान sys का दायरा कचरा कलेक्टर की ओर से ऑपरेटिंग सिस्टम द्वारा उपयोग किया जाने वाला CPU समय है। इस उदाहरण में, कचरा कलेक्टर कचरा संग्रह की तरफ से ऑपरेटिंग सिस्टम निर्देशों को निष्पादित करने वाले किसी भी CPU समय का उपयोग नहीं करता था। असली के दायीं ओर का मूल्य कचरा संग्रह के सेकंड में दीवार घड़ी का समय समाप्त हो गया है। इस उदाहरण में, ने कचरा संग्रह को पूरा करने के लिए 0.06 सेकंड लिया।

Java Performance - अच्छी किताब, डिजिटल संस्करण में पाया जा सकता है। जीसी के प्रभाव को मापने के बारे में एक महान लेख शामिल है।

+0

धन्यवाद, मैं 'प्रिंटजीसीडीईएसई 'का उपयोग कर रहा हूं लेकिन यह मुझे केवल जीसी समय बताता है, मैं तुलना के लिए प्रतिशत जानना चाहता हूं। – Ryan

+0

ईमानदारी से कहकर, एक बहुत ही अजीब उद्देश्य है। जीसी प्रकारों और पीढ़ी के आकारों के साथ खेलकर एक ही परीक्षण मामले के खिलाफ जीसी समय को कम क्यों न करें। – Mikhail

0

नहीं, गणना सही नहीं है।क्या आप की गणना करने के चाहते

(CPU spent on GC)/(total CPU spent on JVM) 

के रूप में अन्य टिप्पणी में बताया, "कुल सीपीयू JVM पर खर्च" 60 * 4 से कम होगी, के रूप में है कि आपके आवेदन और से पूरी प्रणाली लोड मान लिया गया है कोई ऑपरेटिंग सिस्टम या अन्य अनुप्रयोगों द्वारा खर्च किए गए सीपीयू चक्र। लिनक्स पर, "समय" और "पीएस" कमांड का उपयोग यहां उचित संख्या जानने के लिए किया जा सकता है।

हालांकि, "जीसी पर खर्च किया गया सीपीयू" jstat कमांड द्वारा खोजना मुश्किल है। मुझे संदेह है कि जेस्टैट वॉलक्लॉक के समय (और सीपीयू टाइम्स नहीं) की रिपोर्ट करता है, जो ऊपर की गणना के लिए बेकार होगा - फिर से, आप नहीं जानते कि जीसी ने वॉलक्लॉक समय अवधि के दौरान पूरी तरह से सभी कोर लोड किए हैं या नहीं। हैरानी की बात है कि जेएसटीएटी कमांड द्वारा किस तरह का समय (वॉलक्लॉक बनाम सीपीयू) की सूचना दी गई है, इस पर कोई स्पष्ट दस्तावेज नहीं है - अगर मुझे याद आया, तो कृपया यहां एक टिप्पणी छोड़ दें।