In maniera del tutto analoga ad un microprocessore reale, ogni istruzione della macchina ha un codice numerico (opcode). Nel caso di Java, ogni istruzione macchina è rappresentata da un singolo byte. Infatti, otto bit sono sufficienti per rappresentare le circa 200 istruzioni Java. Inoltre, come di consueto, ogni istruzione macchina è seguita da un certo numero di operandi. Gli operandi che hanno una lunghezza superiore ad un byte sono codificati in modo che il byte più significativo sia posto per primo. Per esempio, nel codice macchina un operando di 16 bit viene memorizzato nella seguente maniera:
primo_byte * 256 + secondo_byte
Comunque, nel codice macchina compilato generalmente sono assenti operandi lunghi più di un byte. Quest'ultimi vengono costruiti in fase di esecuzione del programma da più operandi tutti lunghi un byte. Tutto ciò, anche se comporta una perdita in fatto di prestazioni, irrobustisce il codice rendendolo compatto e uniforme (istruzioni e operandi tutti di lunghezza pari ad un byte). La macchina Java può essere implementata come interprete di bytecodes o come compilatore di bytecodes in linguaggio macchina reale. Attualmente è disponibile solo l'interprete di bytecodes, i quali risiedono in file con estensione *.class. Da notare che, in linea di principio, la macchina Java potrebbe essere anche implementata su chip, ovvero come microprocessore reale.