2009-12-22 12 views
6

Su una macchina Windows a 64 bit con 12 GB di RAM e 33 GB di memoria virtuale (per Task Manager), sono in grado di eseguire Java (1.6.0_03-b05) con un'impostazione impossibile -Xmx di 3,5 TB ma non riesce con 35 TB. Qual è la logica dietro quando funziona e quando fallisce? L'errore di 35TB sembra implicare che sta cercando di riservare spazio all'avvio. Perché dovrebbe farlo per -Xmx (al contrario di -Xms)?Perché sono in grado di impostare -Xmx su un valore maggiore della memoria fisica e virtuale sulla macchina su Windows e su Solaris?

 
C:\temp>java -Xmx3500g ostest 
os.arch=amd64 
13781729280 Bytes RAM 

C:\temp>java -Xmx35000g ostest 
Error occurred during initialization of VM 
Could not reserve enough space for object heap 
Could not create the Java virtual machine. 

Su Solaris (4GB di RAM, Java 1.5.0_16), ho praticamente dato fino a 1 PB su quanto in alto posso impostare -Xmx. Non capisco la logica per quando verrà eseguito l'errore sull'impostazione -Xmx.

 
devsun1.mgo:/export/home/mgo> java -d64 -Xmx1000000g ostest 
os.arch=sparcv9 
4294967296 Bytes RAM 

risposta

11

Almeno con Sun 64-bit VM 1.6.0_17 per Windows, ObjectStartArray :: initialize alloca 1 byte per ogni 512 byte di heap all'avvio di VM. Avviare la VM con 35 TB di heap causerà la VM per allocare immediatamente 70 GB e quindi non riuscire sul sistema.

La VM a 32 bit (e quindi suppongo la macchina virtuale a 64 bit) di Sun non tiene conto della memoria fisica disponibile durante il calcolo dell'heap massimo, ma è limitata solo dalla memoria indirizzabile da 2 GB su Windows e Linux o 4 GB su Solaris o forse non è in grado di allocare memoria sufficiente all'avvio per l'area di gestione.

Se ci pensate, controllare la sanità del valore di heap massimo rispetto alla memoria fisica disponibile non ha molto senso. X GB di memoria fisica non significa che X GB sia disponibile per la VM quando richiesto, può anche essere utilizzato da altri processi, quindi la VM ha bisogno di un modo per far fronte alla situazione che è necessario più heap di quello disponibile da il sistema operativo comunque. Se la VM non è interrotta, vengono emessi OutOfMemoryErrors se la memoria non può essere allocata dal sistema operativo, proprio come se fosse stata raggiunta la dimensione massima dell'heap.

8

Secondo this thread sul forum Java di Sun (il PO ha 16GB di memoria fisica):

È possibile specificare -Xmx20g, ma se il totale della memoria necessaria da parte di tutti i processi sul tuo la macchina supera sempre la memoria fisica della macchina, è probabile che si verifichi una perdita di paging. Alcune applicazioni possono sopravvivere nell'esecuzione nella memoria di paging, ma la JVM non è una di queste. Il tuo codice potrebbe funzionare in modo corretto, ma, ad esempio, le raccolte di dati inutili rallenteranno in modo abissale.

UPDATE: Googled un po 'oltre e, secondo il Frequently Asked Questions About the Java HotSpot VM e più precisamente How large a heap can I create using a 64-bit VM?

Quanto è grande un mucchio posso creare con un 64-bit VM?

a 64 bit VM, si hanno 64 bit di indirizzabilità per lavorare con conseguente in una dimensione massima heap Java limitata solo dalla quantità di memoria fisica e lo spazio di swap il sistema fornisce.
Vedere anche Why can't I get a larger heap with the 32-bit JVM?

Non so il motivo per cui si è in grado di avviare una JVM con un mucchio> 45GB. Questo è un po 'di confusione ...

1

Solo per rafforzare la risposta di Pascal - Prestare molta attenzione in Windows quando si specifica una dimensione di memoria massima elevata. Stavo lavorando su un progetto server che richiedeva più memoria fisica possibile, ma una volta superata la RAM fisica, le prestazioni abissali non sono una buona descrizione di cosa accadrà - Hung Machine potrebbe essere migliore.

Cosa succede (almeno questa è la mia valutazione dopo giorni di esami e test di riesecuzione), Windows esaurisce ram e chiede a tutte le app di liberare ciò che possono. Quando chiede a Java, Java avvia un GC. Il GC tocca tutta la memoria (causando lo swapping di tutto ciò che è stato scambiato). Ciò a sua volta fa sì che Windows esaurisca la memoria. Windows quindi invia un messaggio a tutte le app chiedendo loro di liberare ciò che possono .... (recurse all'infinito)

Questo potrebbe non essere ATTUALMENTE quello che sta succedendo, ma il fatto che Java GC tocchi Memoria Molto Vecchia a volte lo rende incompatibile con il paging.

Problemi correlati