我正在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
有什么问题?什么可能秘密使用记忆?非堆或什么?! 谢谢伙计。
答案 0 :(得分:1)
如果您使用的是Java 5+,则应该能够使用jconsole连接到JVM。在那里,您应该能够看到JVM使用的所有内存。除非JVM实现中存在错误(我怀疑),否则您看到的数字就是JVM使用的所有数据。
如果那个足够低,那么其他一些进程就会使用那个内存。
答案 1 :(得分:1)
6511228k cached
表示您的操作系统使用~6.5GB的RAM进行缓存。