Mostly running out of memory. And of course bugs in either the JVM itself or the operating system. But also, native methods (C code interacting with the Java code) can cause crashes. And there are a number of obscure system interfaces, properties, etc, that can cause either a crash or a hang.
In addition, I'm guessing that folks that muck around a lot in GUI interfaces and the like also have, from time to time, found ways to cause a crash.
Depends on who you ask. When the JVM runs low on storage it will signal an out of storage exception. If that basically ripples back to the command line then one can say that your application has crashed, but the JVM did not.
Sometimes the JVM is in a state where it can't effectively signal the exception, and goes down without ever notifying your Java code. One could argue that this is a "JVM crash" (though if you're looking for a "legal" definition, don't depend on it).
But often what happens is that the JVM signals the exception, the application catches it and essentially ignores it, continuing merrily on its way. In such a case you can hardly blame the JVM for pulling the plug.