在Linux下使用top命令查看进程时,经常可以发现Java应用的虚拟内存(即VIRT这一列)占用很高,如下:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
5626 admin 20 0 9009m 496m 7072 S 1.8 6.3 355:00.79 java
这个VIRT代表啥意思呢?昨天看过StackOverFlow一条问题的解释后,这块算是彻底弄明白了。
上面的几列中,RES表示进程实际使用的内存,如果这个值很大则表示使用了大量实际内存,需要引起注意。
而VIRT的具体解释如下:
The total amount of virtual memory used by the task. It includes all code,data and shared libraries plus pages that have been swapped out.
这段解释的意思是VIRT表示进程所有使用过的代码,数据,共享库等等,这其中的许多数据或许已经从内存交换到硬盘上面,很少使用了。
使用pmap pid 可以显示出这个进程曾经使用过的虚拟内存映射。rwx–表示一般的数据空间,r-x–表示常驻磁盘的数据。
具体pmap的详细解释还是得翻看一下man文档。