2017-08-10 157 views
-2

我需要找出Linux中Java進程消耗的實際內存是多少,像visualVM/jconsole這樣的工具顯示的是準確的,但我必須通過top命令計算JVM使用的實際內存。如何計算使用top linux的java的實際內存使用情況?

我正在查看PID:28169如果你看頂部(linux),它說17.2g(虛擬),Res 10g,共享:15m。 10G是不可能的,因爲我已經給這個jvm進程提供了6G jvmmax,但是如果我使用jvmtop它會顯示啓動結果(與visualVM匹配)
有人能告訴我如何使用最高統計數據計算內存的實際使用情況嗎?

使用JvmTop

JvmTop 0.8.0阿爾法 - 11時09分08秒,AMD64,12個CPU,Linux的2.6.32-57,負荷平均0.00 http://code.google.com/p/jvmtop

PID 28169: com.gigaspaces.start.SystemBoot 
ARGS: com.gigaspaces.start.services="GSC" 
VMARGS: -XX:+AggressiveOpts -XX:MaxPermSize=256m -XX:+HeapDumpOnOutOfMemo[...] 
VM: Oracle Corporation Java HotSpot(TM) 64-Bit Server VM 1.7.0_51 
UP: 179:23m #THR: 90 #THRPEAK: 92 #THRCREATED: 3725 USER: evolv 
GC-Time: 0: 2m #GC-Runs: 3353  #TotalLoadedClasses: 23107 
CPU: 1.46% GC: 0.00% HEAP:4623m /10240m NONHEAP: 180m/304m 

    TID NAME         STATE CPU TOTALCPU BLOCKEDBY 
3733 RMI TCP Connection(2210)-10.16  RUNNABLE 14.93%  0.00% 
3734 JMX server connection timeout TIMED_WAITING 0.13%  0.00% 
95 GS-directLoadJobListenerPollin TIMED_WAITING 0.12%  0.14% 
94 GS-jobListenerPollingContainer TIMED_WAITING 0.11%  0.14% 
3375 GS-jobListenerPollingContainer TIMED_WAITING 0.10%  0.55% 
93 GS-jobListenerPollingContainer TIMED_WAITING 0.09%  0.14% 
3377 GS-jobListenerPollingContainer TIMED_WAITING 0.09%  0.56% 
81 GS-subJobCompleteListenerPolli TIMED_WAITING 0.09%  0.14% 
3376 GS-jobListenerPollingContainer TIMED_WAITING 0.08%  0.54% 
98 GS-stopJobListenerPollingConta TIMED_WAITING 0.08%  0.14% 
Note: Only top 10 threads (according cpu load) are shown! 
^C-bash-4.1$ 


using Top : 

top - 11:15:30 up 18 days, 6:34, 1 user, load average: 0.00, 0.00, 0.00 
Tasks: 306 total, 1 running, 304 sleeping, 1 stopped, 0 zombie 
Cpu(s): 0.3%us, 0.1%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st 
Mem: 16332776k total, 15913220k used, 419556k free, 316876k buffers 
Swap: 4095996k total, 146452k used, 3949544k free, 3024048k cached 




PID USER  PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 
28169 evolv  20 0 17.2g 10g 15m S 2.8 70.3 4493:54 java 
28034 evolv  20 0 5690m 289m 7656 S 0.0 1.8 16:31.29 java 
28006 evolv  20 0 5821m 286m 7952 S 0.5 1.8 18:16.50 java 
2098 root  20 0 272m 145m 4016 S 0.3 0.9 46:51.51 splunkd 
2163 root  20 0 128m 40m 1220 S 0.0 0.3 1:05.86 puppet 
1879 root  20 0 244m 6660 5036 S 0.0 0.0 1:21.82 sssd_be 
+0

什麼是你正在使用啓動這個JVM的命令行參數?你說10Gb是不可能的,但是如果你看看jvmtop,它報告堆爲4623m/10240m。 10240m是10Gb,這就是爲什麼top報告10Gb的駐留內存。 – Speakjava

+0

對不起,我想我提到incorreclty我已經給最小和最大10240米 - 這是命令爲Java Xms10240m -Xmx10240m,這是否意味着頂部將始終顯示10克,即使它沒有利用這一數量的內存, – Umer

+0

假設您使用HotSpot來自Oracle的VM然後是。 JVM預先爲您定義的堆的大小預先分配虛擬內存(在這種情況下,最小和最大都是10G,這就是分配的內存)。但請記住,這只是虛擬內存(它本質上只是JVM可以使用的一系列地址)。實際需要內存時,物理內存頁面將只映射到這些虛擬頁面。這就是爲什麼準確地確定JVM使用的內存量非常困難的原因。 – Speakjava

回答

0

您可以使用jstat查看您的過程統計信息。

例子

jstat -gc [insert-pid-here] 

上述會給你你的GC堆的概述。其他

命令

jstat -gccapacity [insert-pid-here] 
jstat -gcutil [insert-pid-here] 
+0

我知道這種方式,但我怎樣才能使用頂部命令給出的數字來計算實際的內存? – Umer