|
Publié le par Davy CLAISSE

JVM Tuning

Réduire la consommation mémoire des JVM sous Linux

Constat

Lorsque vous exécutez une application Java sous Linux, vous pouvez constatez que la consommation en mémoire virtuelle de l'application explose, celle-ci va même jusqu'à dépasser la taille réelle de la mémoire disponible sur le système. D'une manière générale, la taille de la mémoire virtuelle varie entre 32 et 64 fois la valeur définie pour l'option -Xmx ; ce qui peut devenir embarrasant pour un système mutualisé ou encore une station de travail.

Pourquoi ce comportement ?

Cela est du en partie à la GLIBC et sa manière de gérer la pagination avec les applications multithreads mais également au fait que la JVM soit une application s'exécutant sous Linux / Unix / OSX / Windows.

Voici comment s'y prend le kernel Linux pour obtenir ce résultat abscon :

Seuil mémoire de la JVM   x   Taille d'un long sur votre architecture   x   Nb coeurs

Par exemple :

  • Une JVM consomme par défaut 64 Mo de RAM et en moyenne 512 Mo pour les applications classiques (NetBeans, Eclipse, etc).
  • La taille d'un long sur un processeur 64 bits vaut 8 octets.
  • Le nombre de coeurs physiques + logiques est à présent de 8 (4 physiques + 4 logiques)

Aussi, pour une application classique sur une machine standard en 2017 nous aurons le calcul 512 Mo x 8 octets x 8 coeurs = 32768 Go. Ce qui est dantesque au vu de la consommation réelle de l'application.

Solution

Il suffit d'ajouter la ligne suivante soit au fichier .profile de l'utilisateur, soit au fichier /etc/profile du système afin que chaque utilisateur du système en tire bénéfice.

export MALLOC_ARENA_MAX=4

Une fois que cela est fait, vous pouvez redémarrer votre système et constater que cette manipulation aura divisé la taille allouée de la mémoire virtuelle par 4 voire par 8 en fonction de votre architecture ; et bien sûr avec tous les gains en performances que cela implique.