Bytecode is a portable intermediate language. To get decent performance modern JVMs compile it to native code just-in-time, so don't read too much into it: what the CPU will actually execute may look very different. You would have to analyze the generated native code to be able to draw conclusions on why X performs better than Y.
How to get a print-out of the generated assembler code depends on the JVM, see here for instructions for Hotspot (i.e. Oracle JDK and OpenJDK): http://mechanical-sympathy.blogspot.com/2013/06/printing-generated-assembly-code-from.html