जावा प्रोग्राम में जब हजारों समान आकार की वस्तुओं को आवंटित करना आवश्यक होता है, तो यह बेहतर होगा (मेरे दिमाग में) आरक्षित वस्तुओं के साथ "पूल" (जो एक आवंटन है) होना बेहतर होगा जिसे जरूरत पड़ने पर खींचा जा सकता है। यह एकल बड़ा आवंटन ढेर को हजारों छोटे आवंटन के रूप में विभाजित नहीं करेगा।

जाहिर है, पूल स्थापित करने के लिए स्मृति (इसके सदस्य क्षेत्रों के लिए) में किसी ऑब्जेक्ट संदर्भ को विशेष रूप से इंगित करने का कोई तरीका नहीं है। भले ही नई वस्तु पूल के एक क्षेत्र को संदर्भित करती है, फिर भी वस्तु को आवंटित करने की आवश्यकता होगी। देशी ओएस पुस्तकालयों का सहारा लिए बिना आप इस तरह के कई आवंटन को कैसे संभालेंगे?

1
William the Coderer 8 नवम्बर 2011, 06:53

4 जवाब

सबसे बढ़िया उत्तर

आप Commons Pool लाइब्रेरी का उपयोग करके देख सकते हैं।

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

5
Dave Newton 8 नवम्बर 2011, 07:05

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

1
Casey 8 नवम्बर 2011, 07:08

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

वेब पर पर्याप्त सबूत है जो उस वस्तु को दिखाता है पूलिंग, कोई फर्क नहीं पड़ता कि वस्तु कितनी छोटी है, अनुप्रयोग प्रदर्शन के लिए फायदेमंद है।

आप पूलिंग के दो स्तर कर सकते हैं:

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

यह आम तौर पर एक एप्लिकेशन डिज़ाइन निर्णय होता है।

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

1
inder 8 नवम्बर 2011, 09:20

@ डेव और केसी, आपको यह दिखाने के लिए किसी प्रमाण की आवश्यकता नहीं है कि सन्निहित मेमोरी लेआउट कैश दक्षता में सुधार करता है, जो कि अधिकांश ओओपी ऐप्स में प्रमुख बाधा है जिन्हें उच्च प्रदर्शन की आवश्यकता होती है लेकिन "बहुत आदर्शवादी" ओओपी-डिज़ाइन प्रक्षेपवक्र का पालन करें।

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

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

यहां DOP पर SO थ्रेड है।

यहां Sony R&D विभाग का एक स्लाइड शो है जो इसकी उपयोगिता दिखाता है DOP जैसा कि एक प्लेस्टेशन गेम पर लागू होता है (उच्च प्रदर्शन आवश्यक)।

तो उस समस्या को कैसे हल करें जो जावा सामान्य रूप से आपको स्मृति का एक हिस्सा आवंटित करने की अनुमति नहीं देता है? मेरा अनुमान है कि जब कार्यक्रम अभी शुरू हो रहा है, तो आप मान सकते हैं कि पहले से आवंटित पृष्ठों में बहुत कम आंतरिक विखंडन है। यदि आपके पास अब एक लूप है जो हजारों या लाखों वस्तुओं को आवंटित करता है, तो संभवतः वे सभी यथासंभव सन्निहित होंगे। ध्यान दें कि आपको केवल यह सुनिश्चित करने की आवश्यकता है कि लगातार ऑब्जेक्ट एक ही कैशलाइन पर फैले हुए हैं, जो कि कई आधुनिक प्रणालियों में केवल 64 बाइट्स हैं। इसके अलावा, यदि आप वास्तव में अपने आवेदन के (मेमोरी-) प्रदर्शन की परवाह करते हैं, तो डीओपी स्लाइड्स पर एक नज़र डालें।

संक्षेप में: हमेशा एक साथ कई ऑब्जेक्ट आवंटित करें (आवंटन के अस्थायी इलाके में वृद्धि), और, यदि आपके जीसी में डीफ़्रैग्मेन्टेशन है, तो इसे पहले से चलाएं, अन्यथा अपने कार्यक्रम की शुरुआत में ऐसे आवंटन को कम करने का प्रयास करें।

मुझे आशा है, यह कुछ मदद की है, -डोमी

पीएस: @ डेव, कॉमन्स पूल लाइब्रेरी वस्तुओं को आवंटित नहीं करता है। यह केवल आवंटन का ट्रैक रखता है, उन्हें एक संदर्भ सरणी में डालकर, एक स्टैक, लिंक्ड सूची, या इसी तरह में एम्बेड किया जाता है।

0
Community 23 मई 2017, 14:44