Ma première question devrait être, pourquoi la définissez-vous du tout? Le serveur JVM définit le maximum à 1/4 de la taille de la mémoire principale et cela est raisonnable pour la plupart des applications. Vous pouvez changer cela en construisant votre propre JVM ou vous pouvez créer un alias comme
alias java="java -Xmx30g"
Ce que vous pouvez faire, c'est vérifier périodiquement l'utilisation de la mémoire et tuer le processus si vous en utilisez plus. C'est une très mauvaise idée bien sûr.
Au lieu de cela, ce que vous pouvez faire est d'exécuter à nouveau le programme avec les mêmes arguments mais avec la taille maximale du tas que vous souhaitez. C'est-à-dire que vous pouvez runtime.exec.
Vous ne pouvez pas le changer car il réserve la taille maximale de la mémoire au démarrage.
BTW, il y a une idée fausse commune selon laquelle le tas est la seule mémoire qui compte. Ce n'est pas vrai comme le JVM, les piles de threads, la mémoire native, etc. utilisent toutes de la mémoire afin que vous puissiez être le tas de 100 Mo, mais le JVM pourrait utiliser 300 Mo.