2017-08-10 159 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