Come risolvere l'errore di caricamento JVM Java?


Sto lavorando su un'app legacy a 32 bit di grandi dimensioni (15 MB) scritta in C++Builder 6 che deve utilizzare un'API di terze parti per interagire con un sistema esterno. L'API è costituita da un gruppo di DLL che utilizzano internamente Java (presumo JNI). Il nostro codice interagisce solo con una particolare DLL direttamente ed è caricato in ritardo in fase di runtime.

Quando l'app viene eseguita sul sistema di un cliente, la DLL si blocca per motivi sconosciuti. Così ho provato a riprodurre sul mio sistema (XP Pro 32bit) e mi sono imbattuto in un problema diverso.

L'app crea un thread che tenta di inizializzare l'API, che tenta internamente di caricare la JVM Java e fallisce, e l'API riporta un errore "JVM create failure" al mio codice.

Tuttavia, lo stesso identico codice thread in esecuzione in una piccola app di test funziona, Java si carica bene e l'API funziona normalmente.

Entrambe le app vengono eseguite dalla stessa cartella, quindi non si tratta di un problema di percorso che individua le DLL API o le DLL JVM Java. Ho anche fatto in modo che entrambi i progetti utilizzano le stesse impostazioni del compilatore / linker per l'utilizzo della memoria, la dimensione dell'heap, l'allineamento, il tipo di processore, ecc.

Ho visto un riferimento online che suggerisce che la JVM ha bisogno dello spazio degli indirizzi del processo chiamante per avere una grande sezione di memoria contigua disponibile, è vero? Se sì, quanto?

Ho provato ad abilitare la registrazione/traccia nel pannello di controllo Java, ma non è stato registrato nulla di utile.

C'è un modo per scoprire perché Java non riesce a caricare quando chiamato dall'app principale, ma non dall'app di test?

Author: Remy Lebeau, 2014-07-02

1 answers

Sembra che l'applicazione venga avviata con meno memoria.

La memoria predefinita che jre utilizza per avviare JVM dipende dalla configurazione del sistema. Molto probabilmente la memoria predefinita non è abbastanza grande per caricare tutte le classi ed eseguire OOM.

Meglio replicare sulla tua app di test è ridurre la memoria heap a 64 e poi vedere cosa sta succedendo. In questo modo potremmo essere più vicini ad arrivare se è davvero un problema di memoria.

 1
Author: Abhishek, 2014-07-02 05:39:59