La mia prima domanda dovrebbe essere: perché lo stai impostando? Il server JVM imposta il massimo a 1/4 della dimensione della memoria principale e questo è ragionevole per la maggior parte delle applicazioni. Potresti cambiarlo costruendo il tuo possesso di JVM o potresti creare un alias come
alias java="java -Xmx30g"
Quello che puoi fare è controllare periodicamente l'utilizzo della memoria e uccidere il processo se ne usi di più. Questa è una pessima idea ovviamente.
Invece ciò che puoi fare è eseguire di nuovo il programma con gli stessi argomenti ma con la dimensione massima del heap che desideri. Cioè puoi runtime.exec.
Non puoi cambiarlo in quanto si riserva la dimensione massima della memoria all'avvio.
A proposito, c'è un malinteso comune che l'heap sia l'unica memoria che conta. Questo non è vero in quanto JVM, i thread stacks, la memoria nativa ecc. Usano un po 'di memoria, quindi è possibile che il heap sia 100 MB ma il JVM potrebbe usare 300 MB.