Impostazione della dimensione heap JVM in fase di runtime

C’è un modo per impostare le dimensioni dell’heap da un programma Java in esecuzione?

No.

Quello che puoi fare con un’app con requisiti di heap molto variabili è impostare la dimensione massima dell’heap molto alta con -Xmx e tune -XX:MaxHeapFreeRatio e -XX:MinHeapFreeRatio modo che l’app non si blocchi a molta memoria quando l’heap si restringe (lo fa con le impostazioni predefinite).

Tuttavia, si noti che ciò potrebbe causare problemi di prestazioni quando la memoria effettivamente utilizzata dall’app varia in modo forte e rapido – in tal caso è meglio lasciarla sospesa su tutta la memoria anziché restituirla al sistema operativo solo per richiederla ancora un secondo dopo. Potresti anche voler smanettare con le opzioni del GC per assicurarti che il GC non lasci troppi oggetti non reclamati in giro, cosa che tende a fare quando c’è molto spazio per la crescita dell’heap, e che potrebbe sconfiggere l’objective di volendo la dimensione dell’heap per adattarsi alle esigenze dell’app.

Secondo http://www.dreamincode.net/forums/showtopic96263.htm , non è ansible farlo in fase di esecuzione, ma è ansible generare un altro processo con una dimensione heap diversa.

È ansible modificare tali impostazioni quando si avvia l’applicazione, ma una volta che la JVM è triggers e in esecuzione tali valori non possono essere modificati. Qualcosa come questo:

java -Xms32m -Xmx512m FooBar

imposterà la dimensione minima dell’heap a 32 MB e la dimensione massima dell’heap a 512 MB. Una volta impostati, non è ansible cambiarli all’interno del programma in esecuzione.

Il consenso potrebbe infatti essere che ciò non è ansible, ma dovremmo guardare alla fonte JVM per vedere come può essere controllata ergonomicamente. Sarebbe molto bello poter disporre di un agente JVMTI in grado di regolare il heap / perm / tenured / new / & c dimensionamento online / in fase di esecuzione.

Cosa farebbe questo? consentirebbe agli agenti di dedurre gli aggiustamenti di dimensionamento basati su obiettivi di prestazioni o di impronta che saranno importanti quando si spostano JVM nel Cloud.

È ansible utilizzare l’opzione -mx all’avvio (noto anche come -Xmx ) Questa è la dimensione massima che si dovrebbe mai aver bisogno in cui non si dovrebbe aver bisogno di impostarla a più della dimensione massima che sarà mai necessario.

Tuttavia, una soluzione è di avere il principale () controllare la dimensione massima e riavviare il java se la dimensione massima non è quella desiderata. cioè avvia un altro programma java e muori.

Ho fatto la stessa domanda a me stesso. E a differenza delle risposte precedenti, c’è qualcosa che posso fare con la mia app aumentando la dimensione JVM dell’heap massimo. Se l’app è un server Web in modalità cluster, potrei avviare una nuova istanza con dimensioni min / max dell’heap modificate e dell’istanza iniziale di shutdown. Ciò dovrebbe essere particolarmente semplice in GlassFish in cui l’istanza di gestione è separata da JVM di nodeAgent (istanza cluster di app server).

Dal momento che molte applicazioni JVM sono applicazioni web, penso che valga la pena di preservare in questo blog.

java -Xmx500m solo all’avvio

Se comprendo correttamente la tua domanda, stai cercando di cambiare la dimensione dell’heap in fase di esecuzione . Non vedo alcuna ragione per cui questo dovrebbe essere ansible. Imposta la dimensione dell’heap all’avvio usando l’opzione -Xmx JVM. Ti consiglio anche di impostare l’opzione -Xms solo se è assolutamente necessario. Questa opzione imposta la quantità iniziale di memoria principale allocata per JVM.

Dovresti sapere come si comporta la tua applicazione in termini di memoria. Imposta il valore di -Xmx saggiamente. Se la tua app è una specie di app per server, puoi impostare un valore più alto, altrimenti compromettere la tua scelta con altre possibili app in esecuzione su macchine client e, naturalmente, memoria disponibile.