Are you not being a bit simplistic here?
There are several JVM implementations around not just one.
Plus if I understand correctly some complains of people using D in real
projects, in many cases JVM JITs are able to generate better code than
D. At least for the time being.
I used to be intimately familiar with the JVM, I even wrote a gc for it.
The bytecode ops in it are designed for Java, nothing more. Worse, it's
a primitive stack machine. To generate even passably good native code,
the JVM has to do a lot of reverse engineering of the bytecode.
For example, you cannot pass by value anything other than the primitive
Java data types. There are no pointers. Want an unsigned int? Forget it.
Arrays of anything but class references? Nyuk nyuk nyuk. Etc.