Pourquoi la gestion de la mémoire est-elle si visible dans Java VM?

Je joue avec l'écriture de simples applications Web basées sur Spring et les déployer sur Tomcat. Presque immédiatement, je rencontre le besoin de personnaliser les paramètres JVM de Tomcat avec-XX:MaxPermSize (et-Xmx et-Xms); sans cela, le serveur manque facilement D'Espace PermGen.

Pourquoi est-ce un tel problème pour les machines virtuelles Java par rapport aux autres langages collectés? La comparaison des comptes de "tune x memory usage" pour X en Java, Ruby, Perl et Python, montre que Java a facilement un ordre de grandeur plus de hits dans Google que les autres langues combinées.

Je serais également intéressé par des références à des articles techniques/blog-posts / etc expliquant les choix de conception derrière les implémentations GC JVM, à travers différentes JVM ou par rapport à d'autres VM de langage interprété (par exemple en comparant Sun ou IBM JVM à Parrot). Y a-t-il des raisons techniques pour lesquelles les utilisateurs de JVM doivent encore faire face à des tailles de tas/permgen non auto-tuning?

21
demandé sur Emil Sit 2010-03-31 08:39:15

5 réponses

Le titre de votre question est trompeur( pas exprès, je sais): les problèmes de PermSize (et il y en a beaucoup, j'ai été l'un des premiers à diagnostiquer un problème Tomcat/Sun PermGen il y a des années, alors qu'il n'y avait aucune connaissance sur le problème) ne sont pas une spécification Java mais une spécification Sun VM.

Si vous utilisez une machine virtuelle qui n'utilise pas de génération permanente (comme, disons, une machine virtuelle IBM si Je ne me trompe pas), vous ne pouvez pas avoir de problèmes de permgen.

Donc ce n'est pas un problème "Java", mais une machine virtuelle Sun problème de mise en œuvre.

7
répondu SyntaxT3rr0r 2010-03-31 06:14:40

Java vous donne un peu plus de contrôle sur la mémoire-frappez-en un pour les personnes qui veulent Appliquer ce contrôle là, vs Ruby, Perl et Python, ce qui vous donne moins de contrôle sur cela. L'implémentation typique de Java est également très gourmande en mémoire (car elle a une approche de garbage collection plus avancée) wrt les implémentations typiques des langages dynamiques... mais si vous regardez JRuby ou Jython vous trouverez que c'est pas un problème de langue (lorsque ces différentes langues utilisent le même VM sous-jacente, les problèmes de mémoire sont à peu près égalisés). Je ne connais pas d'implémentation "Perl on JVM" répandue, mais s'il y en a une, je suis prêt à parier que ce ne serait pas sensiblement différent en termes d'empreinte de JRuby ou Jython!

5
répondu Alex Martelli 2010-03-31 04:59:32

Python / Perl / Ruby allouent leur mémoire avec malloc() ou une optimisation de celle-ci. La limite de l'espace de tas est déterminée par le système d'exploitation plutôt que par la machine virtuelle, donc il n'y a pas besoin d'options comme-Xmxn. En outre, la collecte des ordures est plus simple, basée principalement sur le comptage des références. Il y a donc beaucoup moins à peaufiner.

De plus, les langages dynamiques ont tendance à être implémentés avec des interpréteurs de bytecode plutôt que des compilateurs JIT, de sorte qu'ils ne sont pas utilisés pour des performances critiques code de toute façon.

1
répondu dan04 2010-03-31 05:26:15

L'essence des réponses de @WizardOfOdds et @Alex-Martelli semble être correcte: Java a un ensemble avancé d'options GC, et parfois vous devez les régler. Cependant, je ne suis toujours pas tout à fait clair sur la raison pour laquelle vous pourriez concevoir une JVM avec ou sans génération permanente. J'ai trouvé un tas de liens utiles sur la collecte des ordures en Java, mais pas nécessairement en comparaison avec d'autres langages avec GC. En bref:

Heureux de mettre à jour cette réponse avec plus de détails si quelqu'un les a.

0
répondu Emil Sit 2012-08-02 13:19:29

C'est parce que Tomcat est en cours d'exécution dans la Machine virtuelle Java, tandis que d'autres langages sont compilés ou interprétés et exécutés sur votre machine réelle. Lorsque vous définissez-Xmx et-Xms, vous dites que vous voulez que JVM fonctionne comme un ordinateur avec une quantité de ram quelque part dans la plage définie.

Je pense que la raison pour laquelle tant de gens y accèdent est que les valeurs par défaut sont relativement faibles et que les gens finissent par atteindre le plafond par défaut assez rapidement (au lieu d'attendre vous manquez de ram réelle comme vous le feriez avec d'autres langues).

-1
répondu aubreyrhodes 2010-03-31 04:59:01