2015-07-28 13 views
5

Ci sono molti post e siti sulla dimensione dell'heap, ma nessuno di essi menziona come scoprire la dimensione massima possibile dell'heap che posso riservare quando si richiama jvm.Java heap JVM massimo prenotabile in anticipo

L'attività è di avviare dinamicamente il mio jvm con la dimensione massima disponibile dell'heap xmx = max (non c'è bisogno di discutere sull'oggetto di questa attività qui!).

Si potrebbe pensare di leggere la memoria disponibile o disponibile corrente e utilizzare quella dimensione per xms e xmx. Ma questo non funziona.

ad esempio su un computer a 64 bit e sistema operativo Windows, con 24 GB di RAM, circa 1,8 GB su memoria virtuale disponibile: (Quelli sono state determinate da C#, che sta eseguendo il comando Java in un processo)

la JVM è lanciato con 32 bit! E secondo altri siti e messaggi come: Maximum Java heap size of a 32-bit JVM on a 64-bit OS dovrebbe variare sopra 1,4 GB.

[09.07.2015 08:39:39] Total physical memory MB:  24002 
[09.07.2015 08:39:39] Available physical memory MB: 16115 
[09.07.2015 08:39:39] Total virtual memory MB:   2047 
[09.07.2015 08:39:39] Available virtual memory MB:  1810 

chiamare un programma Java con:

java -Xms1536m -Xmx1536m myApp

portano a:

Could not reserve enough space for 1572864KB object heap

lo stesso vale tutta la strada fino a 1136m, che è il massimo possibile!

Per quanto riguarda la mia domanda: come verificare in anticipo la dimensione heap possibile per chiamare il jvm, senza errore di prova?

UDPATE: Sulla base di questi commenti, sollevo un'altra domanda per tutti quelli che Pro è là fuori: Come gestite la vostra applicazione Java?

  1. Scegli l'heap che hai controllato l'app Ha bisogno di ca. e lasciare che l'utente muoia in un errore se quell'heap non è possibile
  2. Errore di prova: abbassare l'heap e rieseguire l'app fino a trovare un heap valido valido
  3. Utilizzare questo metodo segreto per determinare la dimensione massima dell'heap e eseguirlo senza intoppi (Se è così, per favore inserire la cerchia di fiducia :))

Sono assolutamente curioso delle vostre risposte!

+0

'solo 1136m è possibile!' Stai usando un JRE a 32 bit? –

+0

@FranMontero scusa se l'ho dimenticato, guarda la risposta aggiornata – gantners

+0

In realtà ho postato una domanda simile qualche settimana fa XD http: // StackOverflow.it/questions/31533378/failed-to-run-java-with-xmx-966m/31534282 # comment51067983_31534282 –

risposta

1

How to check upfront the heap size possible for calling the jvm, without trial and error?

Non c'è un modo.

Certamente, non esiste un modo che fornisca una risposta affidabile basata sul tipo di informazioni che io/io avremmo a disposizione.

(Se ci fosse un modo, allora si può essere certi che Oracle avrebbe saputo e ci avrebbe detto su di esso.)

Il problema è che ci sono troppe "variabili" nell'equazione, e molti di loro sono "variabili nascoste".

+0

Ok ma, quel massimo può variare una volta all'altra? o per lo stesso JRE;, OS, RAM, è sempre lo stesso massimo? –

+0

Sì, il massimo potrebbe variare. Potrebbe anche dipendere dall'applicazione, dalle impostazioni JVM, dai parametri di ottimizzazione del sistema operativo, ecc. –

+0

Il valore massimo può variare in base alla quantità di memoria heap che si desidera utilizzare, ad es. stack di thread, componenti della GUI, librerie condivise, buffer diretti. Non sai nemmeno cosa sia solo perché è iniziata la tua JVM, che non esaurirai la memoria virtuale più tardi. +1 –