This is normal, if you notice the usage is 472308k
and of that 360700k
is listed as cache. The OS is using this "Free" memory as storage. If a program comes in and requests memory, the system will relinquish some of the cached memory to the requesting program. It just uses the available memory when it can to speed up certain operations.
So just looking at total Free memory within Linux is a bit misleading.
As for the apache usage, this is also normal. To take info directly from the top man page:
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 variable and the VIRT will be calculated from the /proc/#/state VmSize field.)
RES -- Resident size (kb)
The non-swapped physical memory a task has used.
RES = CODE + DATA.
So VIRT includes all memory usage, which in this case the apache processes are actually going to be having a lot of the code, libraries etc, in common which is why they are around 300mb. The RES is the size of the resident set of data actually being used currently, which on your system is around 16mb for some of the processes.