java - ये जावा मूल स्मृति कहाँ से आवंटित की गई है?



memory jvm (1)

jemalloc या tcmalloc उपयोग करें - वे दोनों में निर्मित आवंटन profiler है जो आवंटन के स्रोत की पहचान करने में मदद करेगा।

कई कारणों से जावा प्रक्रिया बहुत अधिक मूल स्मृति का उपयोग कर सकती है लोकप्रिय कारण हैं

  • डायरेक्ट बाइटबफ़र्स
  • Unsafe.allocateMemory द्वारा आवंटित मेमोरी
  • बंद संसाधन (जैसे ZipInputStream )
  • अन्य मूल पुस्तकालय

ध्यान दें कि नेटिव मेमोरीट्रैकिंग मूल पुस्तकालयों द्वारा भस्म स्मृति नहीं दिखाएगी।

जेडीके संस्करण हॉटस्पॉट 8u_45 है

मैंने अपनी जावा प्रक्रिया की देशी स्मृति की खोज की मूल स्मृति भी ढेर से अधिक स्थान की खपत होती है। हालांकि कई देशी स्मृति ब्लॉकों जो मुझे भ्रमित कर रहे हैं उदाहरण के लिए pmap -x का नतीजा:

00007f8128000000   65508   25204   25204 rw---    [ anon ]
00007f812bff9000      28       0       0 -----    [ anon ]
00007f812c000000   65508   24768   24768 rw---    [ anon ]
00007f812fff9000      28       0       0 -----    [ anon ]
00007f8130000000   65508   25532   25532 rw---    [ anon ]
00007f8133ff9000      28       0       0 -----    [ anon ]
00007f8134000000   65524   22764   22764 rw---    [ anon ]
00007f8137ffd000      12       0       0 -----    [ anon ]
00007f8138000000   65508   26456   26456 rw---    [ anon ]
00007f813bff9000      28       0       0 -----    [ anon ]
00007f813c000000   65508   23572   23572 rw---    [ anon ]
00007f813fff9000      28       0       0 -----    [ anon ]
00007f8140000000   65520   23208   23208 rw---    [ anon ]
00007f8143ffc000      16       0       0 -----    [ anon ]
00007f8144000000   65512   23164   23164 rw---    [ anon ]
00007f8147ffa000      24       0       0 -----    [ anon ]
00007f8148000000   65516   23416   23416 rw---    [ anon ]
00007f814bffb000      20       0       0 -----    [ anon ]
00007f814c000000   65508   23404   23404 rw---    [ anon ]
00007f814fff9000      28       0       0 -----    [ anon ]
00007f8150000000   65512   24620   24620 rw---    [ anon ]
00007f8153ffa000      24       0       0 -----    [ anon ]
00007f8154000000   65536   23976   23976 rw---    [ anon ]
00007f8158000000   65508   23652   23652 rw---    [ anon ]
00007f815bff9000      28       0       0 -----    [ anon ]
00007f815c000000   65508   23164   23164 rw---    [ anon ]
00007f815fff9000      28       0       0 -----    [ anon ]
00007f8160000000   65508   23344   23344 rw---    [ anon ]
00007f8163ff9000      28       0       0 -----    [ anon ]
00007f8164000000   65508   24052   24052 rw---    [ anon ]
00007f8167ff9000      28       0       0 -----    [ anon ]
00007f8168000000  131052   48608   48608 rw---    [ anon ]
00007f816fffb000      20       0       0 -----    [ anon ]
00007f8170000000   65516   23056   23056 rw---    [ anon ]
00007f8173ffb000      20       0       0 -----    [ anon ]
00007f8174000000   65516   26860   26860 rw---    [ anon ]
00007f8177ffb000      20       0       0 -----    [ anon ]
00007f8178000000   65508   23360   23360 rw---    [ anon ]
00007f817bff9000      28       0       0 -----    [ anon ]
00007f817c000000   65536   24856   24856 rw---    [ anon ]
00007f8180000000   65512   23272   23272 rw---    [ anon ]
00007f8183ffa000      24       0       0 -----    [ anon ]
00007f8184000000   65508   23688   23688 rw---    [ anon ]
00007f8187ff9000      28       0       0 -----    [ anon ]
00007f8188000000   65512   24024   24024 rw---    [ anon ]
00007f818bffa000      24       0       0 -----    [ anon ]
00007f818c000000   65508   25020   25020 rw---    [ anon ]
00007f818fff9000      28       0       0 -----    [ anon ]
00007f8190000000   65512   22868   22868 rw---    [ anon ]
00007f8193ffa000      24       0       0 -----    [ anon ]
00007f8194000000   65508   24156   24156 rw---    [ anon ]
00007f8197ff9000      28       0       0 -----    [ anon ]
00007f8198000000   65508   23684   23684 rw---    [ anon ]

कई ब्लॉक हैं जो लगभग 64 एम पर हैं

मैं इन मेमोरी ब्लॉकों को ट्रैक करने के लिए जेसीएमडी पीआईडी ​​वीएम.नेटिव_मेमेरी विवरण का उपयोग करता हूं। हालांकि, मुझे इन ब्लॉकों को जेसीएमडी के परिणाम में सूचीबद्ध किसी मेमोरी रेंज के साथ नहीं मिला है।

इसके अलावा, मैंने एक आलेख देखा है जिसमें लिनक्स पर जावा 8 और वर्चुअल मेमोरी के मैलोक में क्षेत्र प्रभाव का उल्लेख है। हालांकि ये ब्लॉकों थ्रेड पूल से अलग दिखते हैं क्योंकि 1. मोड rw--- नहीं ----- 2. अखाड़ा थ्रेड पूल केवल वर्चुअल मेमोरी को प्रभावित करता है। यह इन बहुत अधिक आरएसएस की व्याख्या नहीं कर सकता है

आवंटित स्मृति को ट्रैक करने के लिए मैं gdb का उपयोग करता हूँ

dump binary memory mem.bin from to

mem.bin.1

mem.bin.2

mem.bin.3

mem.bin.4

तस्वीर में दिखने वाले लगभग 30 ब्लॉकों हैं

कुछ दिनों के बाद, मैं हेप आवंटन को ट्रैक करने के लिए Google perf टूल का उपयोग करता हूं। और यह पाया:

यह दर्शाता है कि: ज़िप फ्लेट लगभग 2 जी मेमोरी का उपभोग करता है मुझे लगता है कि यह कुछ संकलन मुद्दे के साथ चिंता कर सकता है।

मैंने इस मुद्दे को पढ़ लिया है: https://bugs.openjdk.java.net/browse/JDK-8164293 क्या यह मेरी चिंता से संबंधित है?

तो मैं इन मेमोरी ब्लॉक के स्रोत को कैसे ट्रैक कर सकता हूं?





pmap