2010-06-05 10 views
15

मैंने कई धागे में पढ़ा है कि सूर्य के जेवीएम पर कचरा संग्रह बंद करना असंभव है। हालांकि, हमारे शोध परियोजना के उद्देश्य के लिए हमें इस सुविधा की आवश्यकता है। क्या कोई एक जेवीएम कार्यान्वयन की सिफारिश कर सकता है जिसमें कचरा संग्रह नहीं है या जो इसे बंद करने की अनुमति देता है? धन्यवाद।कोई कचरा संग्रह के साथ JVM

+4

जावा कचरा संग्रहण के बिना, जैसे, अच्छी तरह से C/C++ है !!! –

+1

http://forums.java.net/jive/thread.jspa?messageID=208939&tstart=0 के अनुसार जीसी जावा के पुराने संस्करणों में अक्षम किया जा सकता है लेकिन यह अब संभव नहीं है। –

+8

@ मिच गेहूं, नहीं। यह सी ++ से ** दूर ** है, कोई बफर ओवरफ्लो नहीं है, और कोई अपरिभाषित व्यवहार नहीं है। –

उत्तर

15

मैं अवधारणा के एक साधारण प्रारंभिक प्रमाण के लिए सभी वस्तुओं को याद रखने के लिए एक तेज़ तरीका खोजना चाहता था।

ऐसा करने का सरल तरीका यह है कि जेवी को एक ढेर के साथ चलाने के लिए इतना बड़ा है कि जीसी को कभी भी चलाने की जरूरत नहीं है। -Xmxऔर-Xms विकल्पों को एक बड़े मूल्य के लिए सेट करें, और यह पुष्टि करने के लिए जीसी लॉगिंग चालू करें कि जीसी आपके परीक्षण की अवधि के लिए नहीं चलती है।

यह जेवीएम को संशोधित करने से तेज़ और अधिक सरल होगा।


(मसा में, यह काम नहीं कर सकता। मैं थोड़ा सबूत है कि सूचित किया कि JVM हमेशा नहीं -Xms सेटिंग का सम्मान है, खासकर अगर यह वास्तव में बड़ा था करता देखकर याद करते हैं। फिर भी, इस दृष्टिकोण के लायक है कुछ और अधिक कठिन दृष्टिकोण की कोशिश कर रहा ... JVM को संशोधित करने की तरह से पहले की कोशिश कर रहा।)

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

4

सूर्य के जेवीएम में ऐसा कोई विकल्प नहीं है। AFAIK, कोई अन्य JVM या तो यह विकल्प नहीं है।

आपने यह नहीं बताया कि आप वास्तव में क्या हासिल करने की कोशिश कर रहे हैं लेकिन आपके पास दो विकल्पों में से एक है: या तो एक प्रोफाइलर का उपयोग करें और देखें कि जीसी क्या कर रहा है, इस तरह आप इसके प्रभाव को ध्यान में रख सकते हैं। दूसरा स्रोत से JVMs को संकलित करना है, और वहां से जीसी अक्षम करना है।

-Xbootclasspath विकल्प आपको एपीआई वर्गों के अपने खुद के कार्यान्वयन को निर्दिष्ट कर सकता का उपयोग करना:

+1

उत्तर के लिए धन्यवाद। मैं मूल रूप से जावा प्रोग्राम प्रोफाइल कर रहा हूं। मैं अवधारणा के एक साधारण प्रारंभिक सबूत के लिए स्मृति में सभी वस्तुओं को याद रखने के लिए एक तेज़ तरीका खोजना चाहता था। –

8
अपनी आवश्यकताओं यह शायद काम कर सकता था पर निर्भर करता है

। उदाहरण के लिए ऑब्जेक्ट के कार्यान्वयन को ओवरराइड कर सकते हैं, और ऑब्जेक्ट्स को कचरा होने से रोकने के लिए कन्स्ट्रक्टर, globalList.add(this) में जोड़ सकते हैं। यह निश्चित रूप से एक हैक है, लेकिन सरल केस-स्टडी के लिए यह शायद पर्याप्त है।

एक और विकल्प ओपन सोर्स जेवीएम लेने और कचरा संग्रह शुरू करने वाले हिस्सों पर टिप्पणी करना है। मुझे लगता है कि यह जटिल नहीं है।

+1

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

+2

अच्छा बिंदु। एक साधारण globalList.add (यह) शायद एक अनंत रिकर्सन का कारण बन जाएगा। आपको कुछ और क्लीवर करना होगा। उदाहरण के लिए आप अपनी खुद की सूची-संरचना को कार्यान्वित कर सकते हैं, जिसे सूची में डालने से बाहर रखा गया है। – aioobe

+0

क्या यह पीढ़ी के संग्रह के लिए "छोटे संग्रह" चक्र को रोक देगा? – cody

1

हो सकता है कि आप जीसी के लिए कभी भी चलाने के लिए पर्याप्त वीएम की उपलब्ध मेमोरी बनाने का प्रयास न करें।

मेरा (हालांकि सीमित) अनुभव मुझे यह सुझाव देता है कि वीएम डिफ़ॉल्ट रूप से बेहद आलसी और जीसी चलाने के लिए बेहद अनिच्छुक है।

देने -Xmx 16384M (या कुछ ऐसे) देने और यह सुनिश्चित करने के लिए कि आपका शोध विषय उस सीमा से नीचे रहता है, जो आपको वह पर्यावरण प्रदान कर सकता है जिसे आप प्राप्त करना चाहते हैं, फिर भी यह स्पष्ट रूप से गारंटी नहीं दी जाएगी।

1

क्या आप ओपन सोर्स जेवीएम प्राप्त कर सकते हैं और इसके जीसी को अक्षम कर सकते हैं, उदाहरण के लिए Sun's Hotspot?

यदि कोई कचरा संग्रह नहीं था तो आप इस तरह के कोड के अर्थशास्त्र होने की अपेक्षा करेंगे?

public myClass { 

     public void aMethod() { 

      String text = new String("xyz"); 

     } 

} 

जीसी किसी भी आइटम newed के अभाव में और एक ढेर के साथ scoped संदर्भ पुन: दावा कभी नहीं किया जा सकता है। यहां तक ​​कि यदि आपकी खुद की कक्षाएं इस तरह के स्थानीय चर का उपयोग न करने का निर्णय ले सकती हैं, या केवल आदिम प्रकारों का उपयोग करने के लिए मैं नहीं देखता कि आप किसी भी मानक जावा लाइब्रेरी का सुरक्षित रूप से उपयोग कैसे करेंगे।

मुझे आपके उपयोग परिदृश्य के बारे में अधिक जानने में रुचि होगी।

+1

"स्टैक पर नया"? – aioobe

+0

यदि आप ओपन-सोर्स जेवीएम हैक करने जा रहे हैं, तो सूर्य के हॉटस्पॉट से क्यों शुरू नहीं करें? – Ken

+0

@aioobe yes, इसे बेहतर तरीके से phrased किया जा सकता है - अगर आप चाहें तो संपादित करने के लिए स्वतंत्र महसूस करें। कोड उदाहरण मैं आशा करता हूं कि मेरा क्या मतलब है। विधि से बाहर निकलने पर स्थानीय चर * टेक्स्ट * चला गया है, हमारे पास नए ऑब्जेक्ट का कोई संदर्भ नहीं है और साफ करने का कोई तरीका नहीं है। – djna

0

अगर मैं इस समस्या को मैं होता था आईबीएम के Jikes Research Virtual Machine है क्योंकि:

  • रन-टाइम प्रणाली
  • पूरी बात एक शोध वाहन के रूप में डिजाइन किया गया था (विशेष एक्सटेंशन के साथ) जावा ही में लिखा है और ट्विक करने के लिए अपेक्षाकृत आसान है।

आप जीसी बंद कर सकते हैं नहीं हमेशा के लिए है, क्योंकि जावा कार्यक्रमों करना आवंटित और अंततः आप स्मृति से बाहर चलाने होगा, लेकिन यह काफी संभव है कि आप बताकर आपके प्रयोग की अवधि के लिए जी सी देरी कर सकते हैं जब तक ढेर वास्तव में बड़ा नहीं हो जाता तब तक JVM संग्रह करना शुरू नहीं होता है। (वह चाल अन्य जेवीएम पर भी काम कर सकती है, लेकिन मुझे नहीं पता कि घुटनों को घुमाने के लिए कहां मिलना है।)

1

Oracle's JRockit JVM पर एक नज़र डालें। मैंने इस जेवीएम के साथ इंटेल हार्डवेयर पर बहुत अच्छा पास-निर्धारिती प्रदर्शन देखा है और आप Mission Control उपयोगिता का उपयोग करके रनटाइम को प्रोड और पॉक कर सकते हैं यह देखने के लिए कि यह कितना अच्छा प्रदर्शन कर रहा है।

हालांकि आप पूरी तरह से जीसी नहीं बदल सकते हैं, मुझे विश्वास है कि आप कक्षाओं के संग्रह को अक्षम करने के लिए -Xnoclassgc विकल्प का उपयोग कर सकते हैं। बढ़ने के लिए स्मृति खपत को छोड़ने के खर्च पर जीसी को minimize latency पर ट्यून किया जा सकता है। यदि आप इस मार्ग पर जा रहे हैं तो आपको विलंबता को कम करने के लिए लाइसेंस की आवश्यकता हो सकती है।

जेआरॉकिट जेवीएम का रीयलटाइम संस्करण भी उपलब्ध है लेकिन मुझे नहीं लगता कि इसमें उपलब्ध एक फ्री-टू-डेवलपर संस्करण है।

1

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

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

आप पाएंगे कि आपको स्टार्टअप पर जीसी मिलते हैं और आप स्वीकार्य होने पर नो-जीसी पर विचार कर सकते हैं।

1

अस्थायी रूप से जीसी को रोकने के लिए वास्तव में एक गंदे हैक मौजूद है। पहले जावा में एक डमी सरणी बनाएँ। फिर, जेएनआई में, सरणी को पॉइंटर को पकड़ने के लिए GetPrimitiveArrayCritical फ़ंक्शन का उपयोग करें। सूर्य JVM यह सुनिश्चित करने के लिए जीसी अक्षम करेगा कि सरणी कभी नहीं चली जाएगी और सूचक वैध रहता है। जीसी को पुन: सक्षम करने के लिए, आप पॉइंटर पर रिलीजप्रिमेट एररेक्रिटिकल फ़ंक्शन को कॉल कर सकते हैं। लेकिन यह बहुत कार्यान्वयन विशिष्ट है क्योंकि अन्य वीएम इम्प्लायर पूरी तरह से जीसी को अक्षम करने के बजाए वस्तु को पिन कर सकता है।(Oracle JDK पर काम करने के परीक्षण 7 & 8)

+0

क्या आपने बताया दृष्टिकोण के लिए स्रोत कोड [टेस्ट सेटअप] प्रदान कर सकते हैं .. – Pushparaj

-1

प्रश्न पुराने लेकिन जो लोग रुचि हो सकती है के लिए है, वहाँ

एक जीसी कि केवल स्मृति आवंटन संभालती विकास के लिए एक प्रस्ताव है, लेकिन यह नहीं है किसी भी वास्तविक स्मृति पुनर्मूल्यांकन तंत्र को लागू करें। एक बार उपलब्ध जावा ढेर समाप्त हो गया है, व्यवस्थित JVM शटडाउन निष्पादित करें।

JEP draft: Epsilon GC: The Arbitrarily Low Overhead Garbage (Non-)Collector

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