bike - java platform



जावा वस्तु पुन: उपयोग करें (6)

क्या जावा ऑब्जेक्ट्स को पुन: उपयोग किया जाना चाहिए, क्योंकि इसका पुन: उपयोग किया जा सकता है? या फिर हमें इसका उपयोग तब ही करना चाहिए जब वे "हेवीवेट" हों, यानी ओएस संसाधन इसके साथ जुड़े हों?

ऑब्जेक्ट रीसाइज और ऑब्जेक्ट पूलिंग जितना संभव हो उतना इंटरनेट पर बात करने वाले सभी पुराने लेख, लेकिन मैंने हाल के लेख पढ़ा है जो कि new Object() का कहना है कि अब अत्यधिक अनुकूलित किया गया है (10 निर्देश) और ऑब्जेक्ट पुनः उपयोग उतना बड़ा नहीं है जितना इसका इस्तेमाल होता है होने के लिए।

मौजूदा सर्वोत्तम अभ्यास क्या है और आप इसे कैसे कर रहे हैं?


Answer #1

अंगूठे का नियम आपके सामान्य ज्ञान का उपयोग करना और ऑब्जेक्ट्स का पुनः उपयोग करना चाहिए जब उनकी रचना में महत्वपूर्ण संसाधन जैसे कि I / O, नेटवर्क ट्रैफ़िक, डीबी कनेक्शन आदि का खपत हो।

अगर यह सिर्फ एक नया String() , तो पुन: उपयोग करने के बारे में भूल जाओ, आपको इससे कुछ नहीं मिलेगा कोड पठनीयता में उच्च प्राथमिकता है


Answer #2

ऑब्जेक्ट सृजन निश्चित रूप से तेज़ है जितना इसका इस्तेमाल होता है। जेडीके 5 में नई पीढ़ीगत जीसी और उच्चतर सुधार भी हैं।

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

पुन: उपयोग में थ्रेड-सुरक्षा पर एक प्रीमियम डालता है आपको ध्यान से सोचने की ज़रूरत है कि आप ऑब्जेक्ट्स को सुरक्षित तरीके से पुन: उपयोग कर सकें।

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


Answer #3

मैं कचरा कलेक्टर को मेरे लिए इस तरह का निर्णय लेने देता हूं, केवल कुछ समय के लिए मैंने गहन आवंटित ऑब्जेक्ट्स के साथ हीप की सीमा को हिट कर दिया है, जो कुछ सेकंड के लिए एक बग़ी रीरूइव एल्गोरिथ्म चलाने के बाद किया गया था जो 3 * 27 * 27 उत्पन्न ... नई ऑब्जेक्ट्स जितनी जल्दी हो सके उतना ही हो सके।

क्या पठनीयता और encapsulation के लिए सबसे अच्छा है कभी-कभी पुनः उपयोग करने वाली वस्तुओं उपयोगी हो सकती हैं, लेकिन आमतौर पर आपको इसके बारे में चिंता नहीं करनी चाहिए।


Answer #4

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

वस्तुओं का पुन: उपयोग करके लगता है कि जिस तरह से होने वाला इंतज़ार कर रहे एक आपदा है:

SomeClass someObject = new SomeClass();

someObject.doSomething();
someObject.changeState();
someObject.changeOtherState();
someObject.sendSignal();
// stuff

//re-use 
someObject.reset(); // urgh, had to put this in to support reuse
someObject.doSomethingElse(); // oh oh, this is wrong after calling changeOtherState, regardless of reset
someObject.changeState(); // crap, now this is wrong but it's not obvious yet
someObject.doImportantStuff(); // what's going on?

Answer #5

ऑब्जेक्ट सृजन सस्ता है, हाँ, लेकिन कभी-कभी सस्ता पर्याप्त नहीं है

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

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

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

ऑब्जेक्ट पूलिंग के संबंध में: यह सही कर रहा है और मेमोरी लीक या अमान्य राज्यों में नहीं चल रहा है या प्रबंधन से अधिक समय बिताने से आप बचाना मुश्किल है। इसलिए मैंने कभी उस रणनीति का इस्तेमाल नहीं किया

मेरी रणनीति बस अपरिवर्तनीय वस्तुओं के लिए प्रयास करना है। अपरिवर्तनीय चीज़ों को आसानी से कैश किया जा सकता है और इसलिए सिस्टम को सरल बनाए रखने में सहायता करें।

हालांकि, आप जो भी करते हैं, इससे कोई फर्क नहीं पड़ता: सुनिश्चित करें कि आप पहले अपने प्रोफ़ेशनल के साथ अपने हॉटस्पॉट की जांच करते हैं। समयपूर्व अनुकूलन सबसे बुराई की जड़ है


Answer #6

यदि आप उन्हें बहुत गहराई से उपयोग करते हैं और निर्माण महंगा है , तो आप जितना भी कर सकते हैं उतना उन्हें पुन: उपयोग करने की कोशिश करनी चाहिए।

यदि आपकी वस्तुएं बहुत छोटी हैं, और बनाने के लिए सस्ते (जैसे ऑब्जेक्ट) आपको नया बनाना चाहिए

उदाहरण के लिए कनेक्शन डेटाबेस को जमा किया जाता है क्योंकि एक नया बनाने की लागत बनाने की तुलना में अधिक है .. उदाहरण के लिए mmhh नई पूर्णांक

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

संपादित करें:

इसके अतिरिक्त, प्रभावी जावा से यह आइटम: अनुकूली योग्यता के अनुकूल पढ़ने योग्य है और आपकी स्थिति पर लागू हो सकता है





java