Apache probably allocates a bunch of memory up front, but uses very little of it. That is why it is using a bunch of virtual memory, but little physical memory.
Remember that in Linux, malloc() is always guaranteed to return non-NULL as long as you have the virtual address space available. In other words, you can do this:
Code:
int main(void)
{
unsigned char* mem_hog = malloc( 1GB );
// Linux will always return a valid pointer, even if you don't have 1GB of RAM available. After
// the above call, your application will be using 1GB of virtual memory, but very little physical
// memory.