Yes bytecodes contains zeros and ones, if use the below command and try to get generate the bc of the java file you will see the internal details.
Create a testing.java file with just main method in it.
javac testing.java
This will create .class file, then using the below command create the bytecode
javap -c testing > testing.bc
Its will be as below
Compiled from "testing.java"
public class test.testing extends java.lang.Object{
public test.testing();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>"
)V
4: return
public static void main(java.lang.String[]);
Code:
0: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
3: ldc #3; //String hello world
5: invokevirtual #4; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
8: return
}
When you inspect the bytecode some opcodes are prefixed with a. For example at line 5 aload_0, The prefix is representative of the type that the opcode is working with. The prefix `a' means that the opcode is manipulating an object reference. The prefix `i' means the opcode is manipulating an integer. Other opcodes use `b' for byte, `c' for char, `d' for double, etc. This prefix gives you immediate knowledge about what type of data is being manipulated.
JIT is part of the JVM and is used to speed up execution time, it helps comoile parts of the bytecode that have similar functionality at the same time and reduces the amount of time needed for compilation. Basically its purpose it to take generic bytecode and compile them into more machine specific instructions.
hope this helps