Question

Ce problème est particulièrement sur JVM Sun Java sur Linux x86-64 . J'essaie de comprendre pourquoi la machine virtuelle Java Sun prend tellement de mémoire physique du système, même quand je l'ai fixé des limites et non Heap Heap .

Le programme que je suis en est Eclipse 3.7 avec plusieurs plugins / fonctionnalités. Les fonctionnalités les plus utilisées sont exprimées en HAP, EGit et Mylyn. Je commence l'Eclipse avec les commutateurs de ligne de commande suivante:

-nosplash -vmargs -Xincgc -Xms64m -Xmx200m -XX:NewSize=8m -XX:PermSize=80m -XX:MaxPermSize=150m -XX:MaxPermHeapExpansion=10m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseParNewGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:CMSIncrementalDutyCycleMin=0 -XX:CMSIncrementalDutyCycle=5 -XX:GCTimeRatio=49 -XX:MaxGCPauseMillis=50 -XX:GCPauseIntervalMillis=1000 -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled -XX:+DoEscapeAnalysis -XX:+UseCompressedOops -XX:+AggressiveOpts -Dorg.eclipse.swt.internal.gtk.disablePrinting

A noter en particulier sont les commutateurs:

-Xms64m -Xmx200m -XX:NewSize=8m -XX:PermSize=80m -XX:MaxPermSize=150m

Ces commutateurs devrait limiter la Heap JVM à un maximum de 200 Mo et non Heap à 150 Mo ( "génération CMS permanent" et "Code cache" comme marqué par JConsole). Logiquement la machine virtuelle Java devrait prendre totale de 350 Mo, plus les frais généraux internes requis par la machine virtuelle Java.

En réalité, la machine virtuelle Java prend 544,6 MB pour mon processus actuel Eclipse tel que calculé par ps_mem.py ( http://www.pixelbeat.org/scripts/ps_mem.py ) qui calcule les vraies pages de mémoire physique réservés par le noyau Linux 2.6+. C'est JVM interne Sun au-dessus de 35% ou à peu près 200Mo!

Les conseils sur la façon de réduire ces frais généraux?

Voici quelques informations supplémentaires:

$ ps auxw
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
me       23440  2.4 14.4 1394144 558440 ?      Sl   Oct12 210:41 /usr/bin/java ...

Et selon JConsole, le processus a utilisé 160 Mo de tas et 151 Mo de non-tas.

Je ne dis pas que je ne peux pas se permettre l'utilisation de 200 Mo supplémentaires pour la course Eclipse, mais s'il y a un moyen de réduire ces déchets, je préfère utiliser que pour les tampons de 200Mo périphérique bloc noyau ou cache de fichiers. De plus, j'ai une expérience similaire avec d'autres programmes Java - peut-être que je pourrais réduire les frais généraux pour tous avec quelques réglages similaires

.

Mise à jour: Après avoir affiché la question, je l'ai trouvé post précédent à SO: Pourquoi la machine virtuelle Java Sun continue de consommer de la mémoire de plus en plus RSS, même quand le tas, etc tailles sont stables? Il semble que je devrais utiliser pmap pour enquêter sur le problème.

Était-ce utile?

La solution

Je pense que la raison de la forte consommation de mémoire de votre environnement Eclipse est l'utilisation de SWT. SWT est une bibliothèque graphique native vivant à l'extérieur du tas de la machine virtuelle Java, et d'aggraver la situation, la mise en œuvre sur Linux est pas vraiment optimisé.

Je ne pense pas qu'il y ait vraiment une chance de réduire la consommation de mémoire de votre environnement Eclipse concernant la mémoire en dehors du tas.

Autres conseils

Eclipse est une mémoire et porcine cpu. En plus des bibliothèques de classes Java tous les trucs bas GUI fin est gérée par des appels système natif de sorte que vous aurez une bibliothèque JNI « native » substantielle pour exécuter les appels à faible terme niveau X attachés à votre processus.

Eclipse offre des millions de fonctionnalités utiles et beaucoup d'aides pour accélérer vos tâches de programmation de jour - mais maigre et signifie qu'il n'est pas. Toute réduction de la mémoire ou les ressources entraînera probablement un ralentissement notable. Cela dépend vraiment de combien vous la valeur de votre temps par rapport à mémoire de votre ordinateur.

Si vous voulez gvim maigre et moyenne et faites sont imbattables. Si vous voulez que la complétion de code, automatique builds etc. vous devez vous attendre à payer pour cela avec des ressources supplémentaires.

Si je lance le programme suivant

public static void main(String... args) throws InterruptedException {
    for (int i = 0; i < 60; i++) {
        System.out.println("waiting " + i);
        Thread.sleep(1000);
    }
}

avec ps auwx impressions

USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
500      13165  0.0  0.0 596680 13572 pts/2    Sl+  13:54   0:00 java -Xms64m -Xmx200m -XX:NewSize=8m -XX:PermSize=80m -XX:MaxPermSize=150m -cp . Main

La quantité de mémoire utilisée est de 13,5 Mo. Il environ 200 Mo de bibliothèques partagées qui compte pour la taille de VSZ. Le reste peut être acounted dans le tas max, max perm gen avec une surcharge pour le fil piles etc.

Le problème ne semble pas être avec la machine virtuelle Java, mais l'application en cours d'exécution en elle. L'utilisation de bibliothèques partagées supplémentaires, la mémoire directe et les fichiers de mémoire mappées peut augmenter la quantité de mémoire utilisée.

Étant donné que vous pouvez acheter 16 Go pour environ $ 100, vous savez c'est en fait un problème?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top