This is by design (in bold below):
Linux does not provide an operating system API for generating a system dump from a running process. The JVM produces system dumps on Linux by using the fork() API to start an identical process to the parent JVM process. The JVM then generates a SIGSEGV signal in the child process. The SIGSEGV signal causes Linux to create a system dump for the child process. The parent JVM processes and renames the system dump, as required, by the -Xdump options, and might add additional data into the dump file.
The system dump for the child process contains an exact copy of the memory areas used in the parent. The SDK dump viewer can obtain information about the Java threads, classes, and heap from the system dump. However, the dump viewer [gdb], and other system dump debuggers show only the single native thread that was running in the child process.
If you want all the threads, you may use gcore ${PID}
or -Xdump:tool cleverly and execute gcore %pid
.
IBM proposed a kernel API to create a core dump but it was rejected for security reasons (DoS). There is some experimentation with user-land core dumping.