2011-11-10 12 views
5

Abbiamo un prodotto che viene eseguito su un JRE 1.6 a 32 bit. Usiamo Berkeley DB che consuma circa 2,5 GB di RAM dello spazio di indirizzi di 4 GB. Questo ci lascia circa 750 MB di memoria per lo spazio di indirizzamento JVM.java: Come utilizzare l'heap oltre la memoria da 4 GB in JVM a 32 bit

Attualmente stiamo riscontrando problemi OutOfMemory con la configurazione corrente. Sarebbe bello aumentare la dimensione dell'heap JVM a 1,5 GB, mantenendo comunque lo spazio di 2,5 GB di Berkeley DB. C'è un modo per accedere a più di 4 GB di RAM/heap in una JVM a 32 bit? Ho considerato le seguenti soluzioni
1) utilizzare una JVM che funziona meglio con GC - questo mi darà risultati marginali - Potrei ottenere circa 50-100 MB di memoria di lavoro
2) qualcosa come memcached o "fuori processo ehcache "- questo può farmi ottenere quanto l'hardware consente con il sovraccarico di IPC/serializzazione.

Esistono altre soluzioni per aumentare la memoria indirizzabile di un'applicazione?

La soluzione dovrebbe funzionare su Solaris 10 in esecuzione sparc.

* AGGIORNAMENTO: A causa di utilizzare librerie condivise native, in questo momento, non siamo in grado di passare a una JVM a 64 bit, anche se il sistema operativo è a 64 bit *

ringraziamento,

+1

Il sistema operativo è solaris a 64 bit con molta memoria RAM. È solo il processo Java che ha bisogno di più RAM/heap. – anjanb

+0

anjanb, puoi dire la versione esatta di BerkeleyDB? Quanta memoria è stata riservata a BerkeleyDB? – osgx

risposta

3

I programmi a 32 bit non sono in grado di gestire più di 4 GB di indirizzi di memoria. Semplicemente non hanno abbastanza bit per rappresentare più memoria.

2^32 = 4 294 967 296

La cosa migliore sarebbe quella di passare a un 64-bit di JRE.

+0

A causa dell'utilizzo di librerie condivise native, al momento, non siamo in grado di passare a una JVM a 64 bit anche se il sistema operativo è a 64 bit – anjanb

+0

@anjanb: in tal caso, probabilmente dovrai dividere l'applicazione in più processi, come raccomanda osgx. – StriplingWarrior

5

Esistono altre soluzioni per aumentare la memoria indirizzabile di un'applicazione?

  1. Split singola applicazione in molti processi con memoria non condivisa (non filato; ma processi). Il primo processo può eseguire DB e il secondo può eseguire un'altra parte del progetto. È possibile utilizzare RMI o memoria condivisa o socket per comunicare tra processi.
  2. Memoria inferiore, riservata per OS. Per esempio. su x86-32 PAE consente al sistema operativo di riservare uno spazio di indirizzi virtuali inferiore a 1 GB di 4 GB. (ad esempio "4 GB/4 GB diviso", supportato su Oracle Linux)
  3. Inserire alcuni dati sul disco. Il disco può essere un disco RAM per migliorare la velocità; oppure può essere un vero disco e il sistema operativo accelera l'accesso ai file usando "cache di pagina".

Inoltre, ogni SPARC reale (non antico SuperSparc o LION povero) è veramente 64-bit. Quindi, può essere più facile passare alla versione a 64 bit del sistema operativo. Non so su Solaris, ma in Linux è possibile eseguire applicazioni a 32 bit su sistemi operativi a 64 bit. E il sistema operativo a 64 bit ti consentirà di eseguire JVM a 64 bit.

AGGIORNAMENTO: Esistono ramdisk in Solaris http://wikis.sun.com/display/BigAdmin/Talking+about+RAM+disks+in+the+Solaris+OS e penso che dovresti provarli per l'archiviazione di database (o file temporanei di DB). Non ci saranno serializzazioni/IPC come nel caso (1); solo extra lettura/scrittura o mmap/munmap. Ma Ramdisk è più veloce di SSD e 3-4 ordini più veloce di HDD.

+0

A causa dell'utilizzo di librerie condivise native, al momento, non siamo in grado di passare a una JVM a 64 bit anche se il sistema operativo è 64-bit – anjanb

+1

È possibile spostare librerie native in processi separati? Hai provato a eseguire JVM a 32 bit su sistemi operativi a 64 bit (questo può aiutare a non richiedere la suddivisione in 2/2 o 3/1 GB)? – osgx

+0

Esiste un test rapido per verificare lo schema di suddivisione della memoria: http://stackoverflow.com/questions/987219/max-amount-of-memory-per-java-process-in-windows/987576#987576 - puoi eseguirlo nel tuo ambiente attuale e in combinazione 64-bitOS + 32bit JVM – osgx

3

Suggerisco di eseguire le librerie native condivise a 32 bit in una JVM a 32 bit ed eseguire tutto il resto in una JVM a 64 bit. È possibile fare in modo che la JVM a 64 bit chiami la JVM a 32 bit per fare qualsiasi cosa. Presumo che la maggior parte dei tuoi dati/requisiti di memoria possa essere spostata su una JVM a 64 bit.

+0

che è qualcosa che dovremo sperimentare e vedere se ha senso per il throughput previsto per il sistema. – anjanb

+0

Dovreste essere in grado di ottenere un throughput di 500 MB/sa 3000 MB/s tra due processi sulla stessa macchina (a seconda dell'hardware). –

+0

può suggerire l'approccio migliore per un'applicazione Java 64-bit per comunicare con l'app java a 32 bit. Sono a conoscenza dei soliti meccanismi IPC unix/linux ma quali di questi funzionano meglio nello scenario java a 64-bit e nello java a 32-bit? – anjanb

Problemi correlati