web-dev-qa-db-fra.com

Définition de la taille de segment de mémoire JVM lors de l'exécution

Existe-t-il un moyen de définir la taille du tas à partir d'un programme Java Java en cours d'exécution)?

59
feiroox

Non.

Ce que vous pouvez faire avec une application dont les exigences de segment de mémoire sont très variables est de définir votre taille de segment de mémoire maximale très élevée avec -Xmx et régler -XX:MaxHeapFreeRatio et -XX:MinHeapFreeRatio afin que l'application n'accroche pas à une grande quantité de mémoire lorsque le segment de mémoire diminue (il le fait avec les paramètres par défaut).

Mais notez que cela peut entraîner des problèmes de performances lorsque la mémoire réellement utilisée par l'application varie à la fois fortement et rapidement - dans ce cas, il vaut mieux la laisser s'accrocher à toute la mémoire plutôt que de la restituer au système d'exploitation uniquement pour la revendiquer. encore une seconde plus tard. Vous voudrez peut-être également jouer avec options GC pour vous assurer que le GC ne laisse pas trop d'objets non réclamés traîner, ce qu'il a tendance à faire lorsqu'il y a beaucoup de place pour que le tas grandisse, et qui irait à l'encontre de l'objectif de vouloir que la taille du segment de mémoire s'adapte aux besoins de l'application.

59
Michael Borgwardt

Selon http://www.dreamincode.net/forums/showtopic96263.htm , vous ne pouvez pas le faire au moment de l'exécution, mais vous pouvez générer un autre processus avec une taille de tas différente.

13
thSoft

Vous pouvez modifier ces paramètres lorsque vous démarrez votre application, mais une fois que la machine virtuelle Java est opérationnelle et en cours d'exécution, ces valeurs ne peuvent plus être modifiées. Quelque chose comme ça:

Java -Xms32m -Xmx512m FooBar

définira la taille de segment minimale à 32 Mo et la taille de segment maximale à 512 Mo. Une fois ces paramètres définis, vous ne pouvez plus les modifier dans le programme en cours d'exécution.

7
Andrew Hare

Le consensus peut en effet être que ce n'est pas possible, mais nous devrions regarder la source JVM pour voir comment elle peut être contrôlée ergonomiquement. Il serait très agréable d'avoir un agent JVMTI capable d'ajuster le dimensionnement du tas/perm/tenured/new/& c en ligne/lors de l'exécution.

Qu'est-ce que cela ferait? cela permettrait aux agents de déduire des ajustements de taille en fonction d'objectifs de performances ou d'encombrement qui seront importants lors du déplacement des machines virtuelles Java dans le cloud.

2
Jé Queue

Vous pouvez utiliser l'option - mx au démarrage (également connue sous le nom - Xmx). Il s'agit de la taille maximale dont vous devriez avoir besoin, dans laquelle vous ne devriez pas avoir besoin de la définir sur plus que la taille maximale dont vous aurez besoin.

Cependant, une solution consiste à demander à main () de vérifier la taille maximale et de redémarrer le Java si la taille maximale n'est pas celle souhaitée. Par exemple, démarrer un autre Java = programme et meurs.

2
Peter Lawrey

Je me suis posé la même question. Et contrairement aux réponses ci-dessus, je peux faire quelque chose à propos de l'application my augmentant la taille maximale de la JVM du tas. Si l'application est un serveur Web en mode cluster, je pourrais démarrer une nouvelle instance avec une taille de tas min/max modifiée et arrêter l'instance initiale. Cela doit être particulièrement simple dans GlassFish, où vous avez une instance de gestion séparée de la JVM nodeAgent (instance du serveur d'applications en cluster).

Étant donné que de nombreuses applications JVM sont des applications Web, je pense qu'il vaut la peine de les conserver dans ce blog.

0
Sasha Firsov