Sharing memory is pretty easy when you have a garbage collector. Even if you have concurrency you can use messaging without having to put the communicating components into separate processes. And having separate garbage collected virtual machines wastes a lot of memory if you want to have enough headroom for performance in each one.