I have a process that is reporting in 'top' that it has 6GB of resident memory and 70GB of virtual memory allocated. The strange thing is that this particular server only has 8GB physical and 35GB of swap space available.
From the 'top' manual:
o: VIRT -- Virtual Image (kb)
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. (Note: you can define the STATSIZE=1 environment vari-
able and the VIRT will be calculated from the /proc/#/state VmSize
field.)
VIRT = SWAP + RES.
Given this explanation, I would expect the virutal memory allocation for a process to be limited to my swap + physical memory available.
According to 'pmap', the code, shared library, and shared memory sections of this process are all minimal - no more than 300M or so.
Obviously, the machine and the process are still functioning correctly (albeit slowly), so what am I missing here?
It may be demand zero memory which isn't in physical ram, or in the pagefile.
Some resources you may want to look at:
Does your application create a lot of empty memory pages? If so, your application might benefit greatly from:
It allows you to compress and decompress in real-time memory pages. In turn, you are able to keep everything in RAM rather than swap to disk (very slow).
Here's a discussion of virt vs. resident memory:
https://stackoverflow.com/questions/561245/virtual-memory-usage-from-java-under-linux-too-much-memory-used
The discussion refers to Java processes, but is applicable to anything running under Linux. The main point with regard to virt is that the total includes a whole bunch of stuff that may never be used. Virt is something to look at for 32-bit OSes (since processes will hit limits on addressable space), but is largely not useful otherwise. As noted, the thing to pay attention to is the resident memory, which will be limited to available physical RAM and your swap.
This is likely because the process' address space is the size as you stated, but it is not really allocated by the OS.
From: http://lwn.net/Articles/428100/
So that's the unelegant way memory management is done sometimes - having a continous address space simplifies releasing unused mem.
The answer is probably MMAP - the data is on the disk, but it is "outside" the swap and can not be seen with "free" or "top" command.
If the java process is not too complicated, you can try play with "lsof" to find where the MMAP file is. However if this java process is complicated, there will be difficult to be seen.
I was also surprised that Linux allows you to allocate more virtual memory than there is physical memory + swap space, but apparently it helps performance in typical situations.
http://www.linuxjournal.com/article/10678