C'è qualche vantaggio nell'impostare Xms e Xmx sullo stesso valore?
Di solito ho impostato -Xms512m
e -Xmx1g
in modo che all'avvio della JVM allochi 512 MB e aumenti gradualmente l'heap a 1 GB se necessario. Ma vedo questi valori impostati allo stesso modo di 1g
in un'istanza server dedicata. C'è qualche vantaggio per avere entrambi impostati sullo stesso valore?
5 answers
Beh ci sono un paio di cose.
- Il programma inizierà con il valore-Xms e se il valore è minore alla fine costringerà GC a verificarsi più frequentemente
- Una volta che il programma raggiunge l'heap-Xms, jvm richiede OS per memoria aggiuntiva e alla fine afferra-Xmx che richiede ulteriore tempo che porta a problemi di prestazioni, si potrebbe anche impostarlo su quello all'inizio evitando jvm per richiedere memoria aggiuntiva.
È molto ben risposto qui - https://developer.jboss.org/thread/149559?_sscc=t
Da Oracle Java SE 8 documenti:
Https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/sizing.html Per impostazione predefinita, la macchina virtuale cresce o si restringe l'heap ad ogni collezione per cercare di mantenere la proporzione di spazio libero per vivere gli oggetti ad ogni collezione all'interno di un intervallo specifico. Questo intervallo di destinazione è impostato in percentuale dai parametri
-XX:MinHeapFreeRatio=<minimum>
e-XX:MaxHeapFreeRatio=<maximum>
, e la dimensione totale è delimitata sotto da -Xms<min>
e sopra da-Xmx<max>
. Impostazione-Xms
e {[5] } allo stesso valore aumenta la prevedibilità rimuovendo il dimensionamento più importante decisione dalla macchina virtuale. Tuttavia, la macchina virtuale è quindi incapace di compensare se fai una scelta sbagliata.
Se il valore di-Xms e-Xmx è lo stesso, JVM non dovrà regolare la dimensione dell'heap e ciò significa meno lavoro da parte di JVM e più tempo per l'applicazione. ma se il valore scelto è una scelta sbagliata per-Xms, parte della memoria allocata non verrà mai utilizzata perché l'heap non si ridurrà mai e se si tratta di una scelta sbagliata per-Xmx si otterrà OutOfMemoryError.
Ci sono alcuni vantaggi.
- se sai che la dimensione crescerà al massimo, ad esempio in un benchmark, puoi anche iniziare con la dimensione che sai di aver bisogno.
- è possibile ottenere prestazioni migliori dando al programma più memoria che potrebbe naturalmente darsi. YMWV
In generale, renderei l'Xms un valore che sono sicuro che userà, e il doppio di questo per la head room per casi d'uso futuri o situazioni per cui non abbiamo testato. cioè una taglia che non abbiamo aspettatevi, ma potrebbe usare.
In breve, il massimo è il punto in cui preferiresti che il programma fallisse piuttosto che usarlo di più.
AFAIK Un motivo in più, è che l'espansione dell'heap è un evento stop-the-world
; impostarli sullo stesso valore lo impedirà.
- L'applicazione subirà frequenti GC con un valore-Xms inferiore.
- Ogni volta che si richiede più memoria dal sistema operativo con tempo di consumo.
- Soprattutto, se la tua applicazione è critica per le prestazioni, dovresti sicuramente evitare che le pagine di memoria si scambino da/verso il disco in quanto ciò causerà più tempo per GC. Per evitare ciò, la memoria può essere bloccata. Ma se Xms e Xmx non sono uguali, la memoria allocata dopo l'allocazione iniziale non verrà bloccata.