जावा हीप साइज़ और मेमोरी यूज्ड (लिनक्स) को खोजने के लिए कमांड-लाइन टूल?


171

जावा एप्लिकेशन के हीप साइज (और यूज्ड मेमोरी) को जांचने के लिए कमांड-लाइन टूल (लिनक्स) है?

मैंने जंप के माध्यम से कोशिश की है। लेकिन यह जानकारी देता है। आंतरिक मेमोरी क्षेत्रों जैसे ईडन / पर्मगेन आदि के बारे में, जो मेरे लिए उपयोगी नहीं है।

मैं कुछ इस तरह की तलाश में हूँ:

  • अधिकतम मेमोरी: 1 जीबी
  • न्यूनतम मेमोरी: 256 एमबी
  • हीप मेमोरी: 700 एमबी
  • प्रयुक्त मेमोरी: 460 एमबी

बस इतना ही। मुझे पता है कि मैं JConsole आदि में इसे देख सकता हूं, लेकिन मुझे कमांड-लाइन टूल की आवश्यकता है (जेएमएक्स सक्षम नहीं कर सकता) आदि।

क्या आप ऐसे किसी टूल / कमांड को जानते हैं?

जवाबों:


149

प्रत्येक जावा प्रक्रिया में एक है pid, जिसे आपको पहले jpsकमांड के साथ ढूंढना होगा ।

एक बार जब आपके पास पिड होता है, तो आप jstat -gc [insert-pid-here]एकत्रित किए गए कचरे के व्यवहार के आंकड़े खोजने के लिए उपयोग कर सकते हैं ।

  • jstat -gccapacity [insert-pid-here] मेमोरी पूल पीढ़ी और अंतरिक्ष क्षमताओं के बारे में जानकारी प्रस्तुत करेगा।

  • jstat -gcutil [insert-pid-here]अपनी क्षमता के प्रतिशत के रूप में प्रत्येक पीढ़ी के उपयोग को प्रस्तुत करेगा। उपयोग के एक नज़र में पाने के लिए उपयोगी है।

Oracle की साइट पर jstat डॉक्स देखें ।


11
क्या एक सिफारिश है कि jstatजेवीएम के समग्र स्मृति उपयोग को सत्यापित करने के लिए कौन से विकल्प का उपयोग करना चाहिए? चलो तुम्हारे साथ JVM शुरू कहते हैं Xms=4gऔर Xmx=4gऔर आप को देखने के लिए, कितना है कि की स्मृति को पहले से ही प्रयोग किया जाता है करना चाहते हैं?
बेसजेरो

1
"jstat -gcutil <pid> 250 N" 250 ग्राम अंतराल के साथ N नमूने लेने और संबंधित स्थानों के लिए प्रतिशत के रूप में आउटपुट प्रदर्शित करने के लिए बहुत उपयोगी था। धन्यवाद।
केराम

3
वर्थ से ध्यान देने योग्य बात बोली jstatओरेकल जावा 8 मैनुअल पेज : This command is experimental and unsupported
patryk.beza

1
awk 'print {$3+$4+$6+$8}'Java 8 के jstat कॉलम पर संक्षिप्त उपयोग प्रिंट कर सकते हैं
साइबर वॉश

अन्य उत्तरों से परेशान थे, लेकिन एक बुनियादी ps -ef | grep javaने मुझे वीएम आर्ग दिखाया, जिसमें मेरे मामले में -Xmx मूल्य शामिल था, जो मुझे चाहिए था।
xdhmoore

66

jvmtop एक कमांड-लाइन टूल है जो ढेर सहित कई मैट्रिक्स में लाइव-व्यू प्रदान करता है।

VM अवलोकन मोड का उदाहरण आउटपुट:

 JvmTop 0.3 alpha (expect bugs)  amd64  8 cpus, Linux 2.6.32-27, load avg 0.12
 http://code.google.com/p/jvmtop

  PID MAIN-CLASS      HPCUR HPMAX NHCUR NHMAX    CPU     GC    VM USERNAME   #T DL
 3370 rapperSimpleApp  165m  455m  109m  176m  0.12%  0.00% S6U37 web        21
11272 ver.resin.Resin [ERROR: Could not attach to VM]
27338 WatchdogManager   11m   28m   23m  130m  0.00%  0.00% S6U37 web        31
19187 m.jvmtop.JvmTop   20m 3544m   13m  130m  0.93%  0.47% S6U37 web        20
16733 artup.Bootstrap  159m  455m  166m  304m  0.12%  0.00% S6U37 web        46

यह वास्तव में एक महान उपकरण है, इस तरह की htop लेकिन jstat से मैट्रिक्स के साथ। सुझाव के लिए धन्यवाद, @Malwasser।
ओस्की

65

यह आदेश बाइट्स में कॉन्फ़िगर किए गए हीप आकार दिखाता है।

java -XX:+PrintFlagsFinal -version | grep HeapSize

यह EC2 पर भी अमेज़न AMI पर काम करता है।


26
यह प्रश्न का उत्तर नहीं देता है, जो विशेष रूप से पूछता है कि किसी प्रक्रिया के ढेर उपयोग की जांच कैसे करें। यहाँ कमांड सभी प्रक्रियाओं में JVM चूक को सूचीबद्ध करता है।
मेडब्रेक्स

10
फिर भी, यह मेरे लिए इस पृष्ठ पर आने के लिए एक बहुत ही उपयोगी उत्तर है कि Google खोज के माध्यम से वैश्विक हीप आकार कैसे पाया जाए।
जोहान

@jumping_monkey अप्रत्यक्ष, गलत नहीं है। यदि आप जो कह रहे हैं वह सच है, तो उत्तर को संपादित किया जाना चाहिए या आपको एक नया उत्तर जोड़ने के लिए स्वतंत्र महसूस करना चाहिए।
मदरब्रेक्स 17

42

कोशिश करें कि यह उबंटू और रेडहैट में काम करे:

java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

विंडोज के लिए:

java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"

मैक के लिए

java -XX:+PrintFlagsFinal -version | grep -iE 'heapsize|permsize|threadstacksize'

इस सभी कमांड का आउटपुट नीचे दिए गए आउटपुट से मिलता जुलता है:

uintx InitialHeapSize                          := 20655360        {product}
uintx MaxHeapSize                              := 331350016       {product}
uintx PermSize                                  = 21757952        {pd product}
uintx MaxPermSize                               = 85983232        {pd product}
intx ThreadStackSize                           = 1024            {pd product}
java version "1.7.0_05"
Java(TM) SE Runtime Environment (build 1.7.0_05-b05)
Java HotSpot(TM) 64-Bit Server VM (build 23.1-b03, mixed mode)

एमबी में आकार खोजने के लिए, (1024 * 1024) के साथ मान को विभाजित करें।


पीआईडी ​​द्वारा विशिष्ट जावा प्रक्रिया के, ढेर, अनुमत, ... द्वारा अलग किए गए मेमोरी उपयोग को कैसे खोजें?
गैरी गौह

3
@GaryGauh यह डिफ़ॉल्ट हीप आकार है। रनिंग एप्लिकेशन के उपयोग को खोजने के लिए आपको इसे कोड के भीतर करना चाहिए या आप जोंकोस का उपयोग कर सकते हैं। यह वही है जो मुझे पता है कि कई अन्य तरीके भी होने चाहिए।
पैडिपिस्ट

2
jstat -gc <vmid>रनिंग एप्लिकेशन के लिए उपयोग करें ।
मीका विडेनमैन

27

जेएमएक्स का उपयोग किए बिना, जो कि अधिकांश उपकरण का उपयोग होता है, जो आप कर सकते हैं वह है

jps -lvm

और अनुमान है कि सेटिंग्स कमांड लाइन विकल्पों में से होंगी।

आप डिफ़ॉल्ट रूप से JMX के बिना गतिशील जानकारी प्राप्त नहीं कर सकते, लेकिन आप ऐसा करने के लिए अपनी सेवा लिख ​​सकते हैं।

BTW: मैं JConsole के बजाय VisualVM का उपयोग करना पसंद करता हूं।


25

एक दृश्य पहलू के साथ एक कमांड लाइन उपकरण है - jvm- सोम । यह कमांड लाइन के लिए एक JVM मॉनिटरिंग टूल है जो डिसैपिल करता है:

  • ढेर का उपयोग, आकार और अधिकतम
  • जेवीएम प्रक्रियाएं
  • सीपीयू और जीसी का उपयोग
  • शीर्ष सूत्र

उपकरण के खुले रहने के दौरान मैट्रिक्स और चार्ट अपडेट होते हैं।

नमूना: JVM-मोन


1
बस ध्यान दें कि jvm- मोन केवल Java8 के लिए चलता है
tmanolatos

1
^ है कि अब भी जावा 11. समर्थन करता है, एक नया संस्करण नहीं है
Andrejs

11

पार्टी में देर से, लेकिन jpsstat.sh स्क्रिप्ट का उपयोग करने के लिए एक बहुत ही सरल उपाय है। यह एक सरल लाइव वर्तमान मेमोरी , अधिकतम मेमोरी और सीपीयू उपयोग विवरण प्रदान करता है।

  • गोटो GitHub परियोजना और jpsstat.sh फ़ाइल डाउनलोड करें
  • Jpsstat.sh और गोटो अनुमति टैब पर राइट क्लिक करें और इसे निष्पादन योग्य बनाएं
  • अब निम्नलिखित कमांड का उपयोग करके स्क्रिप्ट चलाएँ ।/jpsstat.sh

यहाँ स्क्रिप्ट का नमूना आउटपुट है -

=====  ======  =======  =======  =====
 PID    Name   CurHeap  MaxHeap  %_CPU
=====  ======  =======  =======  =====
2777   Test3      1.26     1.26    5.8
2582   Test1      2.52     2.52    8.3
2562   Test2      2.52     2.52    6.4

SUSE लिनक्स (लाइन 38: डिक्लेयर: -ए: अमान्य विकल्प) पर बॉक्स से बाहर काम नहीं लगता है
क्रिस

लगता है कि आप साहचर्य सरणी घोषणा में त्रुटि प्राप्त करते हैं, जिसे bash> = 4. की आवश्यकता होती है। स्क्रिप्ट को "sh jpsstat.sh" के रूप में चलाने के कारण एक और समस्या हो सकती है। यदि हां, तो स्क्रिप्ट को "./jpsstat.sh" के रूप में चलाने का प्रयास करें।
अमरजीतअनंद

9

मेरे मामले में मुझे एक डॉकटर कंटेनर के अंदर झंडे की जांच करने की आवश्यकता थी, जिसमें अधिकांश मूल उपयोगिताओं (ps, pstree ... नहीं था ...

उपयोग करने से jpsमुझे JVM की PID चल रही है (मेरे मामले में 1) और फिर jcmd 1 VM.flagsमेरे साथ चल रहे JVM से झंडे मिले।

यह इस बात पर निर्भर करता है कि आपके पास कौन सी कमांड उपलब्ध है, लेकिन यह किसी की मदद कर सकता है। :)


8

से Java8 और इसके बाद के संस्करण , आप कमांड नीचे का उपयोग कर सकते हैं:

jcmd JAVA_PROCESS_IDGC.heap_info

आप आउटपुट से कुल योग और प्रयुक्त मेमोरी का उल्लेख कर सकते हैं।

Sample Command And Output: jcmd 9758 GC.heap_info

PSYoungGen  total 1579520K, used 487543K [0x0000000751d80000, 0x00000007c0000000, 0x00000007c0000000)
  eden space 1354240K, 36% used [0x0000000751d80000,0x000000076f99dc40,0x00000007a4800000)
  from space 225280K, 0% used [0x00000007b2400000,0x00000007b2400000,0x00000007c0000000)
  to   space 225280K, 0% used [0x00000007a4800000,0x00000007a4800000,0x00000007b2400000)
ParOldGen       total 3610112K, used 0K [0x0000000675800000, 0x0000000751d80000, 0x0000000751d80000)
  object space 3610112K, 0% used [0x0000000675800000,0x0000000675800000,0x0000000751d80000)
Metaspace       used 16292K, capacity 16582K, committed 16896K, reserved 1064960K
  class space    used 1823K, capacity 1936K, committed 2048K, reserved 1048576K

Jcmd कमांड पर अधिक जानकारी के लिए, लिंक पर जाएं : https://docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/tooldescr006.html


1
आपको अपनी टिप्पणी सही करने की आवश्यकता है। GC.heap_info जावा 9 और इसके बाद के संस्करण में उपलब्ध है। यह जावा 8 में उपलब्ध नहीं है। यहाँ एक और धागा देखें: stackoverflow.com/questions/41891127/…
Pavel Molchanov

@PavelMolchanov मैं jdk1.8.0_172 में कमांड का उपयोग करने में सक्षम हूं। /Library/Java/JavaVirtualMachines/jdk1.8.0_172.jdk/Contents/Home/bin/jcmd 98270 GC.heap_info। कृपया यदि आप कर सकते हैं, तो संदर्भित थ्रेड में जानकारी जोड़ें और साथ ही साथ एक टिप्पणी जोड़ने के लिए मेरे पास पर्याप्त प्रतिष्ठा नहीं है।
वैभव गुप्ता

क्या आप मैक का उपयोग करते हैं? क्या आप Oracle JDK का उपयोग करते हैं? मुझे नहीं पता कि यह आपके jdk1.8.0_172 में कैसे उपलब्ध हो सकता है, ओरेकल ने इस सुविधा को केवल जावा 9 और इसके बाद के संस्करण में दस्तावेज़ित किया: docs.oracle.com/javase/9/tools/jcmd.htm । यह ओरेकल JDK प्रलेखन जावा 8. के लिए यह लिंक में उल्लेख नहीं है कि आप तल पर दे दी है में नहीं है: docs.oracle.com/javase/8/docs/technotes/guides/troubleshoot/...
पावेल मोलचानोव

एक और प्रश्न। कृपया JDK संस्करण की जाँच करें जो आपके उदाहरण में प्रक्रिया 98270 चल रहा है। jcmd को प्रक्रिया के JVM से कमांड मिलती है (आपके मामले में 98270)। यदि प्रक्रिया 98270 प्रक्रिया को अलग-अलग JDK (JDK 9 या इसके बाद के संस्करण) के साथ निष्पादित किया जाता है, तो आप देखेंगे GC.heap_info कमांड JCMD में भी उपलब्ध है। जावा 8 से ही उपलब्ध है। अलग-अलग प्रक्रियाओं के लिए उपलब्ध कमांड अलग-अलग हो सकते हैं। उपलब्ध कमांड निष्पादित करने के लिए: jcmp <PID> सहायता।
पावेल मोलचनोव

1
FWIW, GC.heap_infoOpenJDK 8 में भी निश्चित रूप से उपलब्ध है। शायद हाल के संस्करणों में ही? मैं इसे एक का उपयोग कर रहा हूं: 8u191-b12-2ubuntu0.18.04.1
प्रति

7

किसी भी दृष्टिकोण से आपको लगभग समान संख्या मिलनी चाहिए। -X..m -X..xसभी पीढ़ियों का उपयोग करके ढेर को आवंटित करना हमेशा एक अच्छा विचार है । आप तब गारंटी दे सकते हैं और यह भी देख सकते हैं कि कौन से पैरामीटर पारित किए गए थे और इसलिए इसका उपयोग किया जा रहा है।

वास्तविक मेमोरी usages के लिए, आप VIRT (आवंटित और साझा किए गए) और RES (वास्तविक उपयोग किए गए) की तुलना मोटे तौर पर jstat मानों से कर सकते हैं:

जावा 8 के लिए, इन मूल्यों के लिए jstat को वास्तव में देखें । मान लें कि आप बिना एमएमएपी या फाइल प्रोसेसिंग के एक साधारण वर्ग चलाते हैं।

$ jstat -gccapacity 32277
 NGCMN    NGCMX     NGC     S0C   S1C       EC      OGCMN      OGCMX       OGC         OC       MCMN     MCMX      MC     CCSMN    CCSMX     CCSC    YGC    FGC
215040.0 3433472.0  73728.0  512.0  512.0  67072.0   430080.0  6867968.0   392704.0   392704.0      0.0 1083392.0  39680.0      0.0 1048576.0   4864.0   7225     2
$ jstat -gcutil 32277
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT     GCT
  6.25   0.00   7.96  18.21  98.01  95.29   7228   30.859     2    0.173   31.032

अधिकतम :

     NGCMX + S0C + S1C + EC    + OGCMX   + MCMX    + CCSMX
   3433472 + 512 + 512 + 67072 + 6867968 + 1083392 + 1048576 = 12 GB

(VIRT मेमोरी के लगभग और नीचे)

अधिकतम (न्यूनतम, प्रयुक्त):

215040 + 512 + 512 + 67072 + 430080  + 39680    +  4864  = ~ 1GB

(लगभग RES मेमोरी के करीब)

"इस पर मुझे उद्धृत न करें" लेकिन वीआईआरटी मेम लगभग मैक्स मेमोरी से अधिक या करीब आवंटित है लेकिन जब तक उपयोग की जा रही मेमोरी भौतिक मेमोरी में मुफ्त / उपलब्ध है, जेवीएम मेमोरी अपवाद नहीं फेंकती है। वास्तव में, अधिकतम मेमोरी को जेवीएम स्टार्टअप पर भौतिक मेमोरी के खिलाफ भी नहीं देखा जाता है, यहां तक ​​कि ओएस पर स्वैप बंद करने के लिए भी। एक जावा प्रक्रिया द्वारा वास्तव में उपयोग की जाने वाली वर्चुअल मेमोरी की बेहतर व्याख्या यहां पर चर्चा की गई है


4

पहले प्रक्रिया आईडी प्राप्त करें, सूचीबद्ध प्रक्रिया में से पहला नंबर, निम्न में से एक से: (या बस उपयोग करें ps aux | grep java, यदि आप चाहें तो)

jps -lvm

फिर यहां प्रक्रिया आईडी का उपयोग करें:

jmap -heap $MY_PID 2>/dev/null | sed -ne '/Heap Configuration/,$p';
jmap -permstat $MY_PID

2

topप्रोग्राम के मेमोरी उपयोग की जांच करने के लिए कमांड का उपयोग करना सबसे सरल तरीका है। RESस्तंभ वास्तविक भौतिक स्मृति को दिखाता है जो एक प्रक्रिया द्वारा व्याप्त है।

मेरे मामले के लिए, मुझे जावा में एक 10g फ़ाइल पढ़ी गई थी और हर बार मुझे आउटऑफमेरी अपवाद मिला। यह तब हुआ जब RESकॉलम में मूल्य -Xmxविकल्प में निर्धारित मूल्य तक पहुंच गया । फिर -Xmxविकल्प का उपयोग करके मेमोरी बढ़ाने से सब कुछ ठीक हो गया।


3
टॉप कमांड दिखा रहा है कि JVM को कितना OS दिया गया है। यह लोग पूछ रहे हैं कि हम जेवीएम के अंदर ढेर अंतरिक्ष उपयोग कैसे देख सकते हैं। जेवीएम 10 जी का उपयोग कर रहा है इसका मतलब यह नहीं है कि असली हीप स्पेस 10 जी डेटा से भरा है, क्योंकि जेवीएम लगभग कभी भी मेमोरी को ओएस से वापस नहीं करता है जब तक कि आप प्रक्रिया को नहीं मारते हैं।
लाइनर्र

2

जावा हीप आकार के संदर्भ में, लिनक्स में, आप उपयोग कर सकते हैं

ps aux | grep java

या

ps -ef | grep java

और निर्दिष्ट प्रारंभिक और अधिकतम ढेर आकार का पता लगाने के लिए -Xms की तलाश करें।

हालाँकि, यदि -Xms या -Xmx जावा प्रक्रिया के लिए अनुपस्थित है जिसमें आप रुचि रखते हैं, तो इसका मतलब है कि आपकी जावा प्रक्रिया डिफ़ॉल्ट हीप आकारों का उपयोग कर रही है। डिफ़ॉल्ट आकार का पता लगाने के लिए आप निम्न कमांड का उपयोग कर सकते हैं।

java -XX:+PrintFlagsFinal -version | grep HeapSize

या एक विशेष jvm, उदाहरण के लिए,

/path/to/jdk1.8.0_102/bin/java -XX:+PrintFlagsFinal -version | grep HeapSize

और BeginHeapSize और MaxHeapSize की तलाश करें, जो बाइट्स में है।


1

यदि jrockit का उपयोग करते हुए jrcmd कमांड लाइन टूल आज़माएं। उदाहरण के लिए:

$ jrcmd 5127 print_memusage
5127:
Total mapped                  1074596KB           (reserved=3728KB)
-              Java heap       786432KB           (reserved=0KB)
-              GC tables        26316KB          
-          Thread stacks        13452KB           (#threads=34)
-          Compiled code         9856KB           (used=9761KB)
-               Internal          840KB          
-                     OS        15036KB          
-                  Other       146632KB          
-        Java class data        75008KB           (malloced=74861KB #103221 in 18709 classes)
- Native memory tracking         1024KB           (malloced=102KB #8)

अधिक कमांड के लिए, जैसे कि heap_diagnostics, उन्हें सूचीबद्ध करने के लिए "jrcmd मदद" का उपयोग करें।

https://blogs.oracle.com/jrockit/entry/why_is_my_jvm_process_larger_t


1
jstat -gccapacity javapid  (ex. stat -gccapacity 28745)
jstat -gccapacity javapid gaps frames (ex.  stat -gccapacity 28745 550 10 )

उपरोक्त आदेश का नमूना ओ / पी

NGCMN    NGCMX     NGC     S0C  
87040.0 1397760.0 1327616.0 107520.0 

NGCMN   Minimum new generation capacity (KB).
NGCMX   Maximum new generation capacity (KB).
NGC Current new generation capacity (KB).

इस बारे में अधिक जानकारी http://docs.oracle.com/javase/1.5.0/docs/tooldocs/share/jstat.html पर प्राप्त करें


1

प्रारूप में ढेर मेमोरी प्रिंट करने के लिए अब तक ऐसा कोई उपकरण नहीं है जैसा कि आपने अनुरोध किया था कि प्रिंट करने का एकमात्र और एकमात्र तरीका रनटाइम क्लास की मदद से एक जावा प्रोग्राम लिखना है ,

public class TestMemory {

public static void main(String [] args) {

    int MB = 1024*1024;

    //Getting the runtime reference from system
    Runtime runtime = Runtime.getRuntime();

    //Print used memory
    System.out.println("Used Memory:" 
        + (runtime.totalMemory() - runtime.freeMemory()) / MB);

    //Print free memory
    System.out.println("Free Memory:" 
        + runtime.freeMemory() / mb);

    //Print total available memory
    System.out.println("Total Memory:" + runtime.totalMemory() / MB);

    //Print Maximum available memory
    System.out.println("Max Memory:" + runtime.maxMemory() / MB);
}

}

संदर्भ: https://viralpatel.net/blogs/getting-jvm-heap-size-used-memory-total-memory-use-java-runtime/


ये गलत है। jmap -heap <pid> यह जानकारी देता है
vsingh

0

ऊपर से अपने वेबएप / जावा प्रोसेस की प्रोसेस आईडी का पता लगाएं। ढेर आवंटन प्राप्त करने के लिए जम्प हीप का उपयोग करें। मैंने लोचदार बीनस्टॉक के लिए AWS-Ec2 पर यह परीक्षण किया

आप आवेदन के लिए 3GB अधिकतम ढेर नीचे छवि में देख सकते हैं

यहां छवि विवरण दर्ज करें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.