2009-08-09 8 views
44

में कमजोर संदर्भों का उपयोग करने की लागत क्या किसी ने जावा WeakReference ऑब्जेक्ट्स एकत्र करने और कचरा बनाने में शामिल रनटाइम लागतों का शोध किया है? क्या बहु-थ्रेडेड अनुप्रयोगों के लिए कोई प्रदर्शन समस्याएं (उदा। विवाद) हैं?जावा

संपादित करें: स्पष्ट रूप से वास्तविक उत्तर JVM निर्भर होंगे, लेकिन सामान्य अवलोकनों का भी स्वागत है।

संपादित करें 2: यदि किसी ने प्रदर्शन के कुछ बेंचमार्किंग किए हैं, या कुछ बेंचमार्किंग परिणामों को इंगित कर सकते हैं, तो यह आदर्श होगा। (क्षमा करें, लेकिन बक्षीस की समयसीमा समाप्त हो गई है ...)

+0

स्पष्ट रूप से यह जेडीके कार्यान्वयन पर निर्भर करेगा, सन बनाम आईबीएम बनाम जेरॉकिट इत्यादि –

+4

[गोएट्ज़] द्वारा एक लेख में एक उत्तर की शुरुआत (http://www.ibm.com/developerworks/java/library/j- jtp01246/index.html): * प्रत्येक कचरा संग्रह में, लाइव रेफरेंस ऑब्जेक्ट्स की एक सूची का निर्माण किया जाना चाहिए, और प्रत्येक संदर्भ को उचित रूप से संसाधित किया जाना चाहिए, जो कि प्रत्येक संग्रह में कुछ प्रति-संदर्भ ओवरहेड जोड़ता है, भले ही रेफरेंस एकत्र किया जा रहा हो उस समय। रेफरेंस ऑब्जेक्ट्स स्वयं कचरा संग्रह के अधीन हैं और रेफरेंस से पहले एकत्र किए जा सकते हैं, इस मामले में उन्हें एनक्यूड नहीं किया जाता है। * – assylias

उत्तर

12

वीक रेफरेंस का सीएमएस कचरा कलेक्टर पर नकारात्मक प्रभाव पड़ता है। जहां तक ​​मैं अपने सर्वर के व्यवहार से देख सकता हूं, यह समांतर टिप्पणी चरण समय को प्रभावित करता है। इस चरण के दौरान सभी ऐप धागे बंद कर दिए गए हैं, इसलिए यह बेहद अवांछित चीज है। तो आपको वीक संदर्भों से सावधान रहना होगा।

+0

इसके लिए खेद है, लेकिन मैं अब सूर्य मंचों पर इस तरह के व्यवहार के कारणों को समझने की कोशिश कर रहा हूं :) – Vitaly

+2

विटाली, क्या अब आप इस पर हैं? अगर आपको सूर्य मंचों पर कुछ जानकारी मिली तो क्या आप एक लिंक पोस्ट कर सकते हैं? धन्यवाद! – Owen

+0

उनके पास किस प्रकार का प्रभाव है, जाहिर है कि लागत है, क्योंकि जीसी को विशेष मामले कमजोर संदर्भ आदि की आवश्यकता है। –

3

कमजोर संदर्भों का उपयोग करके कैश आपके ऐप को काफी धीमा कर सकता है अगर यह मांग पर पुनर्निर्माण हो। टिककर खेल में:

1) अनुप्रयोग मेमोरी कम है

2) जी सी कमजोर संदर्भ साफ है, इस प्रकार कैश भी साफ कर दिया जाता

3) अनुप्रयोग जारी है:

public Object getSomethingExpensiveToFind() { 
    if(cache.contains(EXPENSIVE_OBJ_KEY)) { 
     return cache.get(EXPENSIVE_OBJ_KEY); 
    } 

    Object sth = obtainSomethingExpensiveToFind(); // computationally expensive 
    cache.put(EXPENSIVE_OBJ_KEY, sth); 
    return sth; 
} 

इस परिदृश्य की कल्पना , कई तरीकों जैसे getSomethingExpensiveToFind() को कैश किया जाता है और कैश का पुनर्निर्माण

4) ऐप फिर से स्मृति पर कम चल रहा है

5) जीसी साफ संदर्भ पहनते हैं, कैश को साफ करता है

6) अनुप्रयोग, जारी है() getSomethingExpensiveToFind तरह के तरीकों का एक बहुत लागू कर रहे हैं और कैश फिर

7) के पुनर्निर्माण और इतने पर ...

मैं ऐसी समस्या पर आया - ऐप को अक्सर जीसी द्वारा बाधित किया गया था और यह पूरी तरह से कैशिंग के पूरे बिंदु को हराया।

दूसरे शब्दों में, यदि अनुचित तरीके से प्रबंधित किया गया है, तो कमजोर संदर्भ आपके आवेदन को धीमा कर सकते हैं।

+1

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

+0

तो आपको * मेट्रिक्स * और * बेंचमार्क के बारे में पूछा जाना चाहिए था * विशेष रूप से – mantrid

+0

मैंने किया। बोनस नोटिस में। क्या आपने इसे पढ़ा? लेकिन वैसे भी, आपका उत्तर स्पष्ट रूप से प्रश्न के लिए प्रासंगिक नहीं है जैसा कि पूछा गया है। –

4

मैंने एक बार जावा कचरा कलेक्टर लागू किया, इसलिए जो कुछ भी मैं पूरा करने में सक्षम था वह एक (कमजोर :) संभव है कि कम संभव है।

मेरे कार्यान्वयन में, प्रत्येक कमजोर संदर्भ के लिए कचरा संग्रह के दौरान जाने पर अतिरिक्त ओवरहेड की अतिरिक्त स्थिरता होती है।

तो ऊपर की ओर है: मैं इसके बारे में चिंता नहीं करता, यह एक बड़ी समस्या नहीं है जब तक कि आप कमजोर संदर्भों के ज़िलियन का उपयोग नहीं कर रहे हों।

सबसे महत्वपूर्ण बात यह है कि लागत अस्तित्व में कमजोर संदर्भों की संख्या के समान है, समग्र ढेर का आकार नहीं।

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

मेरा एक सरल "दुनिया को रोकें" चिह्न/साफ़ कचरा कलेक्टर था।कचरा संग्रह के दौरान, यह प्रत्येक ऑब्जेक्ट के लिए दृढ़ संकल्प करता है कि वह ऑब्जेक्ट लाइव है या नहीं और ऑब्जेक्ट हेडर में LIVE बिट सेट करता है। फिर यह सभी गैर-जीवित वस्तुओं को पार करता है और मुक्त करता है।

कमजोर संदर्भ तुम सिर्फ निम्नलिखित जोड़ें संभाल करने के लिए:

  • जब LIVE बिट (अर्थात, वे कारण नहीं है संदर्भित वस्तु पर LIVE बिट सेट करने के लिए) की स्थापना कमजोर संदर्भ पर ध्यान न दें। इस प्रकार
  • झाडू चरण के दौरान, एक विशेष जांच जोड़ें: यदि वस्तु पर आप जा रहे LIVE है, और यह एक WeakReference है, तो वस्तु की जांच है कि यह कमजोर संदर्भ, और यदि उस वस्तु LIVE नहीं है, संदर्भ स्पष्ट ।

मुलायम और प्रेत संदर्भों के लिए इस तर्क कार्य के छोटे बदलाव।

कार्यान्वयन here है यदि आप वास्तव में उत्सुक हैं।

+0

यह बहुत दिलचस्प है। (मुझे लगता है कि हॉटस्पॉट कार्यान्वयन अलग है।) आप उस मामले को कैसे संभालें जहां अंतिम विधि संदर्भित ऑब्जेक्ट को रिलिक करता है? क्या उसे एक (आंशिक) पुनः-चिह्न को ट्रिगर करने की आवश्यकता नहीं होगी? –

+0

मैं 100% निश्चित हूं कि हॉटस्पॉट का कार्यान्वयन न केवल अलग है बल्कि बहुत अधिक परिष्कृत है :) पुन: अंतिम रूप दें, यह गैर-लाइव वस्तुओं के लिए एक अतिरिक्त कदम है। "यह सभी गैर-जीवित वस्तुओं से गुजरता है और मुक्त करता है" यह वास्तव में कहना चाहिए "यह सभी गैर-जीवित वस्तुओं को अंतिम रूप देने के लिए गुजरता है और enquues"। – Archie

+0

पुन: अंतिम रूप देने के लिए, आपको ऑब्जेक्ट हेडर में थोड़ा सेट करना होगा जो इंगित करता है कि 'अंतिमकरण() 'लागू किया गया है या नहीं, इसलिए आप इसे आवश्यकतानुसार दो बार नहीं करते हैं। इसलिए वास्तव में गैर-'LIVE' ऑब्जेक्ट को अंतिम रूप देने के लिए लगाया जाता है यदि बिट सेट नहीं होता है, या बिट सेट होने पर तत्काल मुक्त हो जाता है। – Archie