2009-11-26 4 views
5

हालिया जेवीएम के पास कचरा संग्रह के लिए बहुत सारे एक्सएक्स पैरामीटर हैं (उदाहरण के लिए here देखें), लेकिन क्लाइंट साइड स्विंग एप्लिकेशन वास्तव में बेहतर प्रदर्शन करने वाले विकल्प क्या हैं?क्लाइंट साइड के लिए सबसे अच्छी कचरा संग्रहण सेटिंग्स क्या हैं?

मुझे ध्यान रखना चाहिए कि क्लाइंट साइड जावा एप्लिकेशन पर वास्तव में मुझे परेशान करने वाली चीजों में से एक स्टॉप-द-वर्ल्ड कचरा संग्रह में बड़ी देरी है। इंटेलि-जे आईडीईए में मैंने इसे तीन मिनट या उससे अधिक समय तक देखा है।

संपादित करें: सभी प्रतिक्रियाओं के लिए धन्यवाद। बस रिपोर्ट करने के लिए मैंने आईडीईए के लिए सीएमएस कचरा कलेक्टर डाला (जो here से सुझाए गए सेटिंग का उपयोग करके आईडीईए के लिए एक अच्छा आम संदर्भ है जो कि इस प्रश्न को पढ़ने वाले सभी लोग परिचित हैं)। मैंने यह भी सेट करने के लिए -XX: + स्ट्रिंग कैश सेट किया है कि यह स्मृति आवश्यकताओं को कम करेगा या नहीं।

सामान्य रूप से, अवलोकन यह है कि नियमित रूप से चलने वाला प्रदर्शन उस बिंदु पर अपमानित नहीं होता है जहां आप इसे देख सकते हैं। स्ट्रिंग कैश विकल्प का उपयोग करते हुए मेमोरी कमी विशाल है, हालांकि सीएमएस विधि पूरी तरह से नहीं है और स्मृति को साफ़ करने के लिए विश्व कचरा संग्रहण चक्र (तीन मिनट प्रतीक्षा करने के लिए) को रोकने की आवश्यकता होती है (एक रन में 400 एमबी) ।

हालांकि, कम स्मृति पदचिह्न दिए जाने के बाद, मैं केवल एक छोटी अधिकतम मात्रा में स्मृति डाल सकता हूं जो विश्व संग्रह को आकार में छोटा रखेगा।

आईडीईए 8.1.4 जेडीके 1.6.0_12 के साथ आता है, इसलिए मैंने अभी तक जी 1 का परीक्षण नहीं किया है। इसके अलावा, मेरी मशीन में केवल 2 कोर हैं, इसलिए एक जी 1 दृष्टिकोण वास्तव में अधिकतम नहीं किया जाएगा। बेहतर मशीन के लिए मालिक को मारने का समय;)।

उत्तर

7

इस प्रश्न का कोई भी जवाब नहीं है, यह आपके आवेदन के अनुसार क्या है और यह इसकी वस्तुओं का प्रबंधन कैसे करता है, इस पर निर्भर करता है। विभिन्न विकल्पों को समझने के लिए शायद How does garbage collection work और Parallel and concurrent garbage collectors पर एक नज़र डालें।

फिर, Java SE 6 HotSpot[tm] Virtual Machine Garbage Collection Tuning दस्तावेज़ देखें जो जीसी ट्यूनिंग अवधारणाओं और जावा एसई 6 के लिए तकनीकों का विस्तार करता है जो Tuning Garbage Collection with the 5.0 Java Virtual Machine दस्तावेज़ में पेश किए गए थे।

यदि आप कचरा संग्रहण को कम रखना चाहते हैं, तो समवर्ती संग्राहक सही दिशा की संभावना है क्योंकि यह इसके अधिकांश कार्यों को समवर्ती रूप से करता है (यानी, जबकि एप्लिकेशन अभी भी चल रहा है)। लेकिन सबसे अच्छे सेटअप को खोजने के लिए प्रोफाइलिंग की आवश्यकता होगी (जीसी थ्रुपुट, अधिकतम और औसत विराम समय, पूर्ण जीसी की आवृत्ति और उनकी अवधि भी मापने पर विचार करें)।

(संपादित करें: ओपी से एक टिप्पणी को पढ़ने के बाद, मुझे लगता है कि प्रदर्शन गुरु किर्क Pepperdine से My advice on JVM heap tuning, keep your fingers off the knobs! पढ़ने में एक अच्छा विचार होगा।)

+0

उत्तर के लिए धन्यवाद, लेकिन आप प्रोफाइलिंग में क्या देखेंगे। यही वह डेटा है जो डेटा एक दूसरे पर इंगित करेगा? – Yishai

+0

ठीक है, आम तौर पर, जीसी प्रवाह क्षमता, अधिकतम और औसत विराम समय, पूर्ण जीसी की आवृत्ति और उनकी अवधि भी (सर्वश्रेष्ठ संतुलन ढूँढ़ना)। लेकिन यह है कि जवाब देने के लिए आप –

4

कचरा संग्रहण ट्यूनिंग विज्ञान के बाद एक कला से अधिक है, और यह वास्तव में आपके आवेदन और उसके उपयोग पर निर्भर करता है। यदि मानक स्टॉप-द-वर्ल्ड रणनीतियां आपको परेशान करती हैं, तो क्यों नहीं सीएमएस (समवर्ती चिह्न और स्वीप) या नए जी 1 कलेक्टर में परिवर्तित करें?

पैरामीटर बदलने और एप्लिकेशन व्यवहार की जांच करने के लिए एक प्रोफाइलर संलग्न करने का सबसे अच्छा तरीका है।

2

कोई "सर्वश्रेष्ठ" विकल्प नहीं है (यदि वहां था, तो कोई इसका उपयोग करेगा, है ना?) लेकिन शायद एक विकल्प जो आपके मामले में मदद करता है।

  • नवीनतम वी एम का उपयोग करें: लेकिन यहाँ कुछ सुझाव हैं। प्रत्येक रिलीज के साथ जीसी कोड बेहतर हो गया।
  • क्लाइंट jvm.dll का उपयोग करें (उपलब्ध sinve Java 1.5 jre/bin/client/ में)। यह डिफ़ॉल्ट होना चाहिए।
  • जावा में ऑब्जेक्ट आवंटित और मुक्त करना सस्ता है। उन्हें चारों ओर रखना महंगा है।
+0

आप वास्तव में कह रहे हैं कि आप रखने लगता है कि वस्तुओं की एक पूल लगातार वस्तुओं बनाने और उन्हें साफ करने के लिए मजबूर कर रहा जीसी से भी बदतर है? – tloach

+0

यह ज्यादातर परिस्थितियों में सही है। –

+0

@tloach: हाँ। ऑब्जेक्ट्स जो अब तक नहीं पहुंचा जा सकता है (= कोई संदर्भ नहीं है जो उन्हें इंगित करता है) जीसी के दौरान कुछ भी लागत नहीं है। –

0

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

4

यह काफी स्वचालित है और हमारे लिए काम करता है:

-server -Xss4096k -Xms12G -Xmx12G -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -verbose:gc -Xmaxf1 -XX:+UseCompressedOops -XX:+DisableExplicitGC -XX:+AggressiveOpts -XX:+ScavengeBeforeFullGC -XX:CMSFullGCsBeforeCompaction=10 -XX:CMSInitiatingOccupancyFraction=80 -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:+CMSParallelRemarkEnabled -XX:GCTimeRatio=19 -XX:+UseAdaptiveSizePolicy -XX:MaxGCPauseMillis=500 -XX:+PrintGCTaskTimeStamps -XX:+PrintGCApplicationStoppedTime -XX:+PrintHeapAtGC -XX:+PrintTenuringDistribution -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+PrintGCApplicationConcurrentTime -XX:+PrintTenuringDistribution -Xloggc:gc.log 
+0

सहायक फर लोग हैं, जो जटिल जीसी ट्यूनिंग से अधिक से परेशान नहीं करना चाहते हों :) मुश्किल है। एक और टिप: समायोजित आपकी आवश्यकताओं को और कम से कम मूल्यों के साथ शुरू करने के लिए अधिकतम मान: "-Xms16m -XX: PermSize = 16M" आवेदन पूरा भार के नीचे चल रहा है के बाद, जांच क्या आकार तो उपयोग किया जाता है और न्यूनतम मान को समायोजित। लॉगिंग विकल्पों को भी हटाएं जिनकी आपको आवश्यकता नहीं है। – bebbo

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