@clacke overcommitting RAM is a necessity given that for a long time the standard C advice was "assume malloc() succeeds, because if it doesn't you're dead anyway" and an alarming amount of stuff is written like that. including, basically, the entire userspace of linux :-( but it's an indication of shoddy coding, nonetheless¹
as for GCs - at some point they all end up tracing the heap, which necessitates paging it all in. the best-performing modern GCs then immediately move those objects to the end of the heap and mark them forwarded, and fix up the pointers on every load so that the system never sees a stale pointer.. but still, parallel to that are tracer threads whose job it is to walk the entire heap and ensure that all live objects are copied out. again, the best modern GCs have early-release systems which can recover pages as soon as the last object is copied off them... assuming they only contain live objects, of course!
the Azul C4 paper is well worth a read