Java Webapp:奇怪的内存统计

时间:2011-07-18 08:06:24

标签: java memory-leaks memory-management

我正在Linux Centos机器上运行Java Web应用程序(J2EE + Tomcat6 + struts2 + hibernate)。 问题是“top”命令说java使用了14%的内存(8G中),但在摘要信息部分中,表示整体可用内存为300M! (只是Mem,而不是交换)

    PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  SWAP   TIME CODE DATA nFLT COMMAND                                                                                                                                 
    666 root      20   0 1352m 1.2g  10m S  7.6 14.7 663:00.37 158m 663:00   36 1.3g   65 java
   3170 mysql     18   0  145m  33m 5044 S  0.7  0.4 753:51.96 111m 753:51 6496 132m  100 mysqld                                                                                                                                  
  17340 root      15   0  2332 1080  800 R  0.3  0.0   0:00.05 1252   0:00   56  468    0 top                                                                                                                                     
      1 root      15   0  2068  628  536 S  0.0  0.0   0:02.58 1440   0:02   32  280   20 init                                                                                                                                    
      2 root      RT  -5     0    0    0 S  0.0  0.0   0:00.18    0   0:00    0    0    0 migration/0                                                                                                                             
      3 root      34  19     0    0    0 S  0.0  0.0   0:00.00    0   0:00    0    0    0 ksoftirqd/0                                                                                                                             
      4 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00    0   0:00    0    0    0 watchdog/0                                                                                                                              
      5 root      RT  -5     0    0    0 S  0.0  0.0   0:00.01    0   0:00    0    0    0 migration/1                                                                                                                             
      6 root      34  19     0    0    0 S  0.0  0.0   0:00.00    0   0:00    0    0    0 ksoftirqd/1                                                                                                                             
      7 root      RT  -5     0    0    0 S  0.0  0.0   0:00.00    0   0:00    0    0    0 watchdog/1                                                                                                                              
      8 root      RT  -5     0    0    0 S  0.0  0.0   0:00.01    0   0:00    0    0    0 migration/2

.
.
.
and so on...



Mem:   8300688k total,  7998720k used,   301968k free,    52452k buffers
Swap: 16779884k total,       60k used, 16779824k free,  6511228k cached

有什么问题?什么可能秘密使用记忆?非堆或什么?! 谢谢伙计。

2 个答案:

答案 0 :(得分:1)

如果您使用的是Java 5+,则应该能够使用jconsole连接到JVM。在那里,您应该能够看到JVM使用的所有内存。除非JVM实现中存在错误(我怀疑),否则您看到的数字就是JVM使用的所有数据。

如果那个足够低,那么其他一些进程就会使用那个内存。

答案 1 :(得分:1)

6511228k cached表示您的操作系统使用~6.5GB的RAM进行缓存。