मैंने सी में एक पुस्तकालय लिखा है जो बहुत सारी स्मृति (लाखों छोटे ब्लॉक) का उपभोग करता है। मैंने एक सी प्रोग्राम लिखा है जो इस पुस्तकालय का उपयोग करता है। और मैंने एक जावा प्रोग्राम लिखा है जो एक ही पुस्तकालय का उपयोग करता है। जावा प्रोग्राम पुस्तकालय के चारों ओर एक बहुत ही पतली परत है। असल में केवल एक मूल विधि है जिसे बुलाया जाता है, क्या सभी काम करता है और बाद में घंटे लौटाता है। जावा इनवोकेशन इंटरफेस का उपयोग कर जावा और मूल पुस्तकालय के बीच कोई और संचार नहीं है। न ही जावा ऑब्जेक्ट है जो स्मृति की उल्लेखनीय मात्रा का उपभोग करता है।जावा द्वारा उपयोग किए जाने पर मूल पुस्तकालय 1.5 गुना अधिक स्मृति का उपयोग क्यों करता है जब लिनक्स के तहत सी-प्रोग्राम द्वारा उपयोग किया जाता है?
तो सी प्रोग्राम और जावा प्रोग्राम बहुत समान हैं। संपूर्ण गणना/स्मृति आवंटन मूल पुस्तकालय के अंदर होता है। फिर भी। जब सी प्रोग्राम निष्पादित किया गया तो 3 जीबी मेमोरी खपत होती है। लेकिन जावा प्रोग्राम 4.3 जीबी का उपभोग करता है! (शीर्ष पर रिपोर्ट की गई वीआईआरटी राशि)
मैंने जावा प्रक्रिया के मेमोरी मानचित्र (pmap का उपयोग करके) की जांच की। पुस्तकालयों द्वारा केवल 40 एमबी का उपयोग किया जाता है। तो जावा द्वारा लोड अतिरिक्त पुस्तकालय कारण नहीं हैं।
क्या किसी के पास इस व्यवहार के लिए कोई स्पष्टीकरण है?
संपादित करें: अभी तक उत्तर के लिए धन्यवाद। इसे थोड़ा और स्पष्ट बनाने के लिए: जावा कोड कुछ भी नहीं करता है लेकिन मूल पुस्तकालय ONCE पर आक्रमण करता है! जावा ढेर मानक आकार (शायद 60 एमबी) है और इसका उपयोग नहीं किया जाता है (एक वर्ग को छोड़कर मुख्य विधि और दूसरी कक्षा मूल पुस्तकालय का आह्वान करती है)।
मूल पुस्तकालय विधि एक लंबी दौड़ है और बहुत सारे मॉलॉक्स और मुक्त करता है। फ्रैगमेंटेशन एक स्पष्टीकरण है जिसे मैंने खुद भी सोचा था। लेकिन चूंकि कोई जावा कोड सक्रिय नहीं है इसलिए जावा प्रोग्राम और सी प्रोग्राम के लिए विखंडन व्यवहार समान होना चाहिए। चूंकि यह अलग है, इसलिए मुझे यह भी लगता है कि सी प्रोग्राम या जावा प्रोग्राम में चलाने पर प्रयुक्त मॉलोक कार्यान्वयन अलग-अलग होते हैं।
लिए intresting अवलोकन: मैं इसे openjdk के स्रोत कोड (
arguments.cpp
) को देख पाया। मैं इस व्यवहार की उम्मीद नहीं करता। – x4uमॉलोक ढेर विखंडन। Http://stackoverflow.com/a/28935176/166062 –
@LariHotari देखें, जबकि इस प्रश्न का कारण एक अलग था (मेरा जवाब देखें), हमें वास्तव में विखंडन के साथ भी समस्याएं थीं। हमने इसे वैकल्पिक कार्यान्वयन जैसे टीसीएमएलओसी, जेमलोक या लॉकलेसिंक से मॉलोक कार्यान्वयन पर स्विच करके हल किया। –