मेरे पास एक जावा प्रोग्राम है जो मेरी उबंटू 10.04 मशीन पर चलता है और बिना किसी उपयोगकर्ता इंटरैक्शन के, बार-बार एक MySQL डेटाबेस से पूछताछ करता है और उसके बाद आईएमजी- और txt-files बनाता है जो डेटा से पढ़ता है डीबी। यह हजारों प्रश्नों को बनाता है और हजारों फाइलें बनाता है।जावा प्रोग्राम के मेमोरी खपत के मुद्दे
कुछ घंटों के चलने के बाद, स्वैप स्पेस सहित मेरी मशीन पर उपलब्ध स्मृति पूरी तरह से उपयोग की जाती है। मैंने अन्य कार्यक्रम शुरू नहीं किए हैं और पृष्ठभूमि में चल रही प्रक्रियाएं बहुत मेमोरी का उपभोग नहीं करती हैं और वास्तव में खपत में नहीं बढ़ती हैं।
इतनी मेमोरी आवंटित करने के बारे में जानने के लिए मैं एक ढेर डंप का विश्लेषण करना चाहता था, इसलिए मैंने -Xms64m -Xmx128m -XX: + HeapDumpOnOutOfMemoryError के साथ प्रक्रिया शुरू की।
मेरे आश्चर्य के लिए, स्थिति पहले की तरह ही थी, कुछ घंटों के बाद कार्यक्रम सभी स्वैप आवंटित कर रहा था जो 128m के दिए गए अधिकतम से परे है।
विजुअलVM के साथ डीबग किए गए एक और रन से पता चला है कि ढेर आवंटन 128 एम के अधिकतम से अधिक नहीं है - जब आवंटित स्मृति अधिकतम अनुमानित होती है, तो इसका एक बड़ा हिस्सा फिर से जारी किया जाता है (मुझे कचरा कलेक्टर द्वारा माना जाता है)।
तो, यह लगातार बढ़ती ढेर में कोई समस्या नहीं हो सकती है।
जब स्मृति सब प्रयोग किया जाता है:
USER VIRT RES SHR COMMAND
[my_id] 504m 171m 4520 java
[my_id] 371m 162m 4368 java
(अब तक दो "सबसे बड़ी" प्रक्रियाओं और:
total used free shared buffers cached
Mem: 2060180 2004860 55320 0 848 1042908
-/+ buffers/cache: 961104 1099076
Swap: 3227640 3227640 0
शीर्ष निम्नलिखित पता चलता है:
मुक्त निम्न से पता चलता केवल जावा प्रक्रियाएं चल रही हैं)
मेरा पहला प्रश्न है:
- मैं ओएस स्तर पर कैसे पता लगा सकता हूं (उदा। कमांड लाइन टूल्स के साथ) इतनी मेमोरी आवंटित कर रहा है? शीर्ष/htop मेरी मदद नहीं की है। कई मामलों में, स्मृति के खाने के समान प्रकार की कई छोटी प्रक्रियाएं: क्या समान प्रक्रियाओं को समझदारी से जोड़ने का कोई तरीका है? (मुझे पता है कि शायद विषय से दूर है, क्योंकि यह एक Linux/Ubuntu सवाल यह है, लेकिन मेरी मुख्य समस्या अभी भी जावा से संबंधित हो सकता है)
मेरा पुराना सवाल थे:
- क्यों नहीं है शीर्ष आउटपुट में दिए गए मेरे कार्यक्रम की स्मृति खपत?
- मैं कैसे पता लगा सकता हूं कि इतनी मेमोरी आवंटित कर रहा है?
- यदि ढेर समस्या नहीं है, तो केवल "आवंटित कारक" ढेर है? ( स्टैक कोई समस्या नहीं होनी चाहिए क्योंकि कोई गहरी "विधि कॉल गहराई नहीं है")
- बाहरी संसाधनों के बारे में डीबी कनेक्शन के बारे में क्या?
प्रोफाइलिंग टूल का उपयोग करने का प्रयास करें: http://stackoverflow.com/a/9205812/90909 – qrtt1
@ qrtt1: मैंने विजुअलVM का उपयोग किया, लेकिन इससे पता चला कि ढेर समस्या नहीं है (ऊपर देखें)। –
आपको यहां एक उत्तर मिल सकता है मुझे लगता है कि http://stackoverflow.com/a/9306054/1140748 और http://www.oracle.com/technetwork/java/hotspotfaq-138619.html#gc_oom (बग विवरण देखें) –