Question: **I imagine that no, they aren't, because every process has its own memory space, of course.**

But how does the whole JVM thing actually work? Is there a separate JVM in a separate process for every Java program that I launch? Do Java programs running in a system share anything at all? Are there differences between OSs and JVM implementations? Can I *make* programs share variables (i. e. directly through the JVM rather than the usual IPC mechanisms)? Are there more exotic one-process JVMs for special purposes?

Generally, what are recommendable reads about the guts of JVMs? The [spec](http://java.sun.com/docs/books/jls/third_edition/html/j3TOC.html)? The source code of some implementation? Websites? Books?

Answer: 
No, static variables aren't between JVMs. Yes, there's a separate JVM process for each Java app you run.

In some implementations I believe they may share *some* resources (e.g. memory for JITted code of JRE classes) but I'm not sure. I believe there's ongoing work to enable more sharing, but still in a robust way. (You don't really want one JVM crashing to affect others.)

No, you can't make programs share variables transparently.

I believe there are books about the JVM, but I can't recommend any. You'd probably be best off looking for HotSpot white papers for details of that. [This one](http://java.sun.com/products/hotspot/whitepaper.html) is a pretty good starting point.
You are correct in your assumption. Yes, each JVM is a separate process. You can confirm this by opening Task Manager when you're running two Java programs (sort processes by name and look for java.exe or javaw.exe).

It is possible to make JVMs connect to each other (with local sockets, for instance), but there's nothing built in.