Prima che il caricatore passi alla virual machine i bytecode di una classe Java appena caricata, i bytecode devono superare l'ispezione effettuata da un verificatore. Quest'ultimo controlla che le istruzioni non svolgano azioni illecite (le variabiali vengano inizializzate prima dell'uso, lo stack di runtime non vada in overflow, etc.). Vengono verificate tutte le classi, tranne qulle di sistema. La verifica può essere disattivata con l'opzione non documentata -noverify (java -noverify Myprogram
). Se fallisce anche una sola delle verifiche, la classe viene considerata corrotta e non viene caricata.
Nota
E' lecito chiedersi come il verificatore possa garantire che un file di classe sia completamente privo di errori sul tipo, variabili non inizializzate, etc. Il teorema di Godel è una legge che sostiene l'impossibilità di proggettare algoritmi che abbiano file di programma come input e generino come output un valore booleano che indica se il programma di input ha (non ha) una determinata proprietà. In effetti, il verificatore messo a punto da Sun Microsytems non è un algoritmo decisionale nel senso definito da Godel. Se il verificatore accetta un programma, il programma è senz'altro sicuro. Tuttavia parecchi programmi effettivamente sicuri potrebbero non superare l' esame del verificatore.
L'intrasigenza delle verifiche ha un grande valore ai fini della sicurezza. In molti casi, errori accidentali possono provocare gravi problemi.
Nel mondo di Internet è fondamentale che esistano garanzie di protezione da programmi maligni, progettati con l'intenzione specifica di danneggiare i sistemi altrui.