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.
If you want to share variables across JVMs, you could look at clustering products like [Terracotta](http://www.terracotta.org/web/display/orgsite/What+Is+Terracotta). They refer to themselves as "network attached memory" and let you share object references across JVMs using replication technology.