If you define a crash as an unhandled problem (i.e. no Java Exception or Error), then this can not be done from within Java (this is the whole point of managed code). Typical crashes in native code happen by dereferencing pointers to wron memory areas (like Nullpointer) or illegal Opcodes. Another source could be failed syscalls (but this is normally related to hardware problems).
JVMs (especially JIT compiler) could have bugs. Also external libraries or divers (especially graphics drivers) can have problems leading to real crashes. Also Native code can make a JVM crash. In all cases the crash handler of the JVM kicks in and dumps the state. It could also be a native core file (Dr. Watson on Windows).
On Linux/Unix you can easyly make a JVM crash by sending it a Signal to the running process. Note: you should not use "SIGSEGV" for this, since Hotspot catches this signal and rethrows it as a NullPointerException in most places. So it is better to send a SIGBUS for example.