Considerazioni generali sul porting

Prima di trasferire le applicazioni Java™ su sistemi a 64 bit, è necessario considerare una serie di problemi.

La piattaforma Java su processori a 64 bit

Le implementazioni a 64 bit della piattaforma Java esistono per un numero di sistemi a 64 bit, inclusi IBM® Power ® e IBM Z®. Ciò è necessario per i seguenti motivi:
  • Su sistemi a 32 bit, lo spazio heap Java massimo (dove gli oggetti Java sono conservati al runtime) è 4GBo 2GB su sistemi z/OS® a 31 bit, mentre i sistemi a 64 bit possono avere spazi heap fino a (e superiori) 32GB. Questo spazio heap più grande è essenziale per le applicazioni Java per essere in grado di utilizzare le funzionalità complete di sistemi grandi e potenti.
  • Alcune applicazioni Java utilizzano il codice nativo tramite JNI (Java Native Interface), dove il codice nativo è a 64 bit. Ad esempio, il driver Java Database Connectivity (JDBC) è scritto in codice nativo a 64 - bit su una piattaforma a 64-bit.
  • Alcune applicazioni Java richiedono altre funzionalità migliorate di sistemi a 64 bit.

L'API Java e il codice nativo di trasferimento

Figura 1. Applicazioni Java in esecuzione su un sistema a 64 bit
È possibile accedere al codice dell'applicazione Java tramite un'API mediante le librerie di classe Java awt, net, lang, io e rmi. La Java VM a 64 bit contiene JIT e Heap e può comunicare con il codice nativo tramite JNI e JVMTI. Insieme, questi vengono eseguiti come un processo a 64 bit e il livello HPI consente a questo processo di comunicare con il sistema operativo host.

Il diagramma precedente è utile per identificare i componenti significativi e per comprendere cosa è necessario modificare quando si trasferono le applicazioni da a 32 bit a 64 bit. Tutte le applicazioni Java vengono scritte in un'API (application programming interface) Java definita. Questa API è la stessa per le versioni 32 bit e 64 bit della piattaforma Java.

L'API Java include le librerie di classi Java (ad esempio, awt, swing, net, lang, ioe rmi) che costituiscono una parte fondamentale della piattaforma Java. L'API Java, e tutto il codice Java, è esattamente lo stesso su un'implementazione a 64 bit come su un'implementazione a 32 bit . Pertanto, se si dispone di un codice dell'applicazione Java che viene eseguito su un sistema Java a 32 bit , non viene modificato su un sistema a 64 bit.

Molte applicazioni Java non sono scritte al 100% nel linguaggio Java. Per queste applicazioni, parte del loro codice è scritto in un linguaggio non Java, come C o C + +, che è generalmente indicato come "codice nativo". Il porting delle applicazioni Java che hanno codice nativo richiede più impegno.

Tutto il codice Java (l'applicazione e le librerie di classe) viene eseguito dalla Java Virtual Machine (Java VM). Java VM contiene componenti secondari che eseguono il codice Java e gestiscono i dati nell'heap Java. La VM J9 include un JIT (just - in - time compiler) che compila il codice Java nelle istruzioni del processore nativo prima dell'esecuzione. Questo processo di compilazione massimizza le prestazioni del codice.

In un'implementazione a 64 bit dell'ambiente Java, è la Java VM che viene implementata come un programma a 64 bit e che è consapevole della natura a 64 bit del processore sottostante. Ciò include il compilatore JIT, che deve compilare il codice Java per utilizzare indirizzi a 64 bit. Il compilatore JIT è inoltre a conoscenza della serie completa di istruzioni a 64 bit disponibili sul processore sottostante.

La Java VM comunica con il sistema operativo tramite HPI (Host Porting Interface). Questa comunicazione rende il codice Java VM indipendente dal sottostante sistema operativo e consente all'implementazione IBM della piattaforma Java di supportare una gamma di sistemi operativi su un determinato tipo di processore.

JNI e codice nativo

La Java VM, il livello HPI e il codice Java vengono tutti eseguiti all'interno di un singolo processo del sistema operativo a 64 bit. Normalmente, c'è del codice nativo che viene eseguito all'interno dello stesso processo. Il codice nativo è una o più librerie di codice compilate direttamente per il processore e il sistema operativo. Si accede al codice nativo dal codice Java tramite JNI (Java Native Interface). Il codice nativo può anche accedere a metodi e oggetti Java tramite JNI. Del codice nativo fa parte dell'implementazione J2SE , come ad esempio il codice che implementa le classi Java awt utilizzando le funzioni grafiche e di finestre fornite dal sistema operativo. Un altro codice nativo può essere fornito come parte di un'applicazione.

Esiste un'altra interfaccia simile a JNI: JVMTI (Java Virtual Machine Tool Interface). Questa interfaccia fornisce funzioni per la creazione profili e il debug di applicazioni Java. Per utilizzare queste funzionalità, è necessario scrivere del codice nativo.

Nel caso delle implementazioni a 64 bit della piattaforma Java, tutto il codice nativo associato alla VM Java a 64 bit deve essere a 64 bit, poiché viene eseguito nello stesso spazio di elaborazione della VM Java. Non è possibile eseguire codice a 64 bit e codice a 32 bit nello stesso spazio di processo a causa dell'incompatibilità delle dimensioni degli indirizzi tra questi due tipi di codice.

Il codice nativo, tipicamente scritto nei linguaggi C o C + +, è direttamente consapevole della dimensione degli indirizzi. Se l'applicazione dispone di codice nativo, il codice nativo deve essere modificato per funzionare correttamente con le differenze negli ambienti a 64 bit, ad esempio gli indirizzi a 64 bit. Infine, il codice nativo deve essere ricompilato e ricollegato per il sistema a 64 bit.

In sintesi, l'implementazione di Java VM a 64 bit viene eseguita su un processore a 64 bit e si collega al codice che è anche "consapevole" a 64 bit. La Java VM è anche in grado di utilizzare il supporto di memoria di grandi dimensioni e le istruzioni a 64 bit del processore sottostante. Le applicazioni Java che esegue sono esattamente le stesse che possono essere eseguite sulle implementazioni a 32 bit di Java. Solo il codice nativo deve essere trasferito dai sistemi a 32 bit ai sistemi a 64 bit.

Il vantaggio dei programmi Java quando si passa da a 32 bit a 64 bit

Il linguaggio e l'ambiente Java rendono semplice la transizione dall'elaborazione a 32 bit all'elaborazione a 64 bit. Per i programmi scritti in altri linguaggi che dispongono di puntatori di indirizzo espliciti, come C e C + +, il porting di un'applicazione da a 32 bit a 64 bit può richiedere notevoli sforzi. Questo perché ogni puntatore deve essere dichiarato nuovamente come quantità a 64 bit e qualsiasi calcolo relativo agli indirizzi deve essere controllato attentamente e regolato per garantire che venga eseguito correttamente nell'ambiente a 64 bit. Al contrario, il 100% delle applicazioni Java non ha nemmeno bisogno di essere ricompilato per essere eseguito correttamente nell'ambiente a 64 bit. Per le applicazioni Java, tutto il duro lavoro viene eseguito dall'implementazione Java VM, mentre la dimensione del puntatore sottostante è nascosta dalla vista.