, यह करने के लिए कोई आसान तरीका नहीं है हालांकि, मैं हाल ही में बड़े जावा क्षुधा की स्मृति प्रदर्शन का विश्लेषण किया गया है, और कुछ अनुभव को साझा कर सकते हैं।
सबसे पहले आप को पहचानने के लिए क्या वस्तुओं "पुराने/पर्याप्त" अंतरिक्ष में हैं की जरूरत है:
यहाँ मैं कैसे पाया क्या वस्तुओं पुराने पीढ़ी के लिए प्रोत्साहित किया जा रहा है। यह मूल रूप से आप मानक जावा ढेर विश्लेषण है। इसके लिए मैं jmap की सलाह देते हैं। यह सूर्य जेवीएम का हिस्सा है। रन: jmap -dump:file=heap.hprof PID
एक ढेर डंप पाने के लिए। इस डंप (~ एक 2GB ढेर पर 30 सेकंड के लिए)
अब Memory analyser में .prof फ़ाइल लोड (इसके लिए सबसे अच्छा उपकरण है, नीचे हाथ) मैं एक दिन बिताते थे मेमोरी विश्लेषक के साथ खेल के दौरान JVM रुकेगा इसे समझने के लिए, स्क्रीनकैम देखें (एक लॉगिन की जरूरत है, लेकिन इसके लायक है)।
अब आप जान लेंगे कि आपके ढेर में कौन सी वस्तुएं हैं।
यहाँ चाल है: "नहीं पहुंचा जा सकता वस्तुओं हिस्टोग्राम": स्मृति विश्लेषक का अवलोकन स्क्रीन में, वहाँ के लिए एक कड़ी है। अब इन वस्तुओं को अगले जीसी के दौरान एकत्रित किया जाना है। लेकिन कुछ शायद ईडन में हैं, कुछ जीवित रहने वाले और कुछ पुराने में हैं।
अब, स्मृति क्षमता की रूपरेखा के साथ कुछ प्रोफाइलर मिलता है, मैं yourKit पसंद करते हैं। अपने ऐप को अपनेकिट के साथ चलाएं और ऑब्जेक्ट आवंटन रिकॉर्ड करें।
इसे चलाएं और ऑब्जेक्ट निर्माण रिकॉर्ड करें। एक बार जब आपके पास बनाई गई वस्तुओं की एक सूची हो, तो क्या हो रहा है इसकी एक तस्वीर प्राप्त करने के लिए सभी तीन सूचियों का उपयोग करें। जो मनुष्य सबसे अच्छा करते हैं, पैटर्न देखें।
- कौन सी वस्तुएं बनाई गई हैं और पहुंच योग्य हैं। (मेमोरी विश्लेषक)
- ढेर (मेमोरी विश्लेषक)
- वस्तुओं एक रन (प्रोफाइलर)
एक और तरीका है दृष्टिकोण YourKit generations view है के दौरान बनाया में नहीं पहुंचा जा सकता ऑब्जेक्ट्स। आप अपने ढेर के स्नैपशॉट्स ले सकते हैं और तुलना कर सकते हैं कि स्नैपशॉट्स के बीच कौन सी वस्तुएं अभी भी जीवित हैं। आप visualgc के साथ इस का उपयोग करते हैं आप यह निर्धारित कितनी देर तक एक वस्तु पुराने पीढ़ी के लिए प्रोत्साहित किया जा करने के लिए जिंदा होना चाहिए, और क्या वस्तुओं अभी भी जीवित हैं देखने के लिए इन अंतराल पर स्नैपशॉट ले जा सकते हैं।
ठीक है, अच्छी किस्मत। /संयुक्त