Also, the top values may not tell the whole story - RES should include paged-in code plus memory allocated by the program. VIRT includes code not paged in yet and linked shared libraries, so the difference may not all be in swap.
I thought I remembered reading (maybe LKML) that RES also didn't account for the COW efficiency of shared libraries. Meaning RES could potentially show a value which is larger than actual physical memory used. Sorry if I'm spreading misinformation :)
Thanks.