Java: Pourquoi MaxPermSize existe-t-il?

Pourquoi MaxPermSize existe-t-il?

Voici un bon article sur la génération permanente dans le Garbage Collector:

Présentation de la génération permanente sur le blog de Jon Masamitsu

MODIFIER:

Je n’ai rien vu qui indiquerait pourquoi ils ont pris la décision de concevoir une limite maximale pour la taille de la génération permanente. Mais j’imagine que cela a été fait pour plusieurs raisons.

  1. Il est beaucoup plus facile à mettre en œuvre, les GC sont décidément non sortingviaux, donc simplifier votre implémentation de quelque manière que ce soit est probablement une bonne idée.

  2. YAGNI (Vous n’en aurez pas besoin) la plupart des applications chargent un nombre fixe de classes et ce n’est généralement pas particulièrement important.

  3. En supposant que votre taille de génération de génération augmente de façon imprévisible, vous avez probablement une erreur dans un chargeur de classe (ou devez repenser votre architecture). Même dans les applications qui génèrent des classes au moment de l’exécution (ou font de telles astuces), le nombre de classes générées est généralement également fixé. Vous devriez donc pouvoir ajuster maxperm en fonction de vos besoins.

  4. Je ne suis pas un expert des détails relatifs au chargement de classes Java et au ramassage des ordures, mais ils font tous deux partie compliquée de la machine virtuelle. J’imagine qu’ils essaieraient de garder ces deux composants aussi orthogonaux que possible et de permettre à la permanence de croître. dynamicment couplerait probablement ces deux composants de manière compliquée (en particulier parce que les deux composants ont de sérieuses considérations de threading)

  5. Limiter le nombre maximal de permanentes disponibles présente probablement des avantages en termes de performances. Le fait de permettre à celle-ci de croître peut impliquer une copie supplémentaire de la collection ou peut signifier que la génération de ces permanentes n’existe plus dans un espace d’adressage contigu, ce qui pourrait affecter la manière dont vos autres algorithmes travailler pour gérer la collection.

De toute évidence, ce sont toutes des spéculations. Mais même si tout cela est faux, je ne pense vraiment pas que ce soit «idiot» pour le soleil d’avoir choisi une taille fixe, il y a probablement beaucoup plus de considérations d’ingénierie et de mise en œuvre que je ne pourrais même en rêver 🙂

Pour présenter une perspective légèrement différente, IBM JVM ne possède pas de permgen, mais va plutôt sur le système d’exploitation et alloue des morceaux de mémoire en fonction de ses besoins. (la rumeur est que jrockit fait la même chose, mais je ne peux pas confirmer avec certitude.)

Ceci est avantageux car vous n’allez pas atteindre une limite (apparemment) arbitraire et vous devez l’adapter aux situations de croissance légitimes.

D’un autre côté, c’est un problème pour les applications emballées (qui fuient essentiellement les classes) – la JVM va essentiellement consumr toute la mémoire dans l’espace d’adressage. Cela peut avoir des conséquences néfastes: le code natif va soudainement échouer, les appels malloc () ou Java doit se briser de façon étrange – comme l’impossibilité d’allouer de nouveaux threads (ce qui consum de la mémoire pour la stack). Un autre inconvénient est qu’il ne fournit pas de “certitude en matière de coûts” sur la quantité de mémoire consommée par la JVM.

Donc, c’est un compromis – comment voulez-vous échouer dans des scénarios de “méchanceté potentielle”?

Son utilisé pour dimensionner la génération permanente maximale. Dans certains algos ou si vous utilisez beaucoup et beaucoup de classes différentes, vous pouvez l’utiliser. Donnez à celui-ci une lecture.

Mais surtout il est utilisé comme une question dans les examens ……

Il existe car il permet d’ajuster le sous-système de récupération de place dans la machine virtuelle Java. En fonction de l’architecture sous-jacente et de la gestion de la mémoire, une implémentation JVM peut avoir un garbage collection sous-optimal (trop thrashy par exemple) … Vous pouvez spécifier manuellement MaxPermSize plutôt que de le calculer afin que l’application se comporte de manière fluide …

La page Java GC en dit plus …

La génération permanente est utilisée pour refléter la machine virtuelle elle-même, telle que des objects de classe et des objects de méthode. Ces objects réfléchissants sont atsortingbués directement à la génération permanente et dimensionnés indépendamment des autres générations. Généralement, le dimensionnement de cette génération peut être ignoré car la taille par défaut est adéquate. Cependant, les programmes qui chargent de nombreuses classes peuvent nécessiter une génération permanente plus importante.

PermSize est un espace de segment distinct distinct de la valeur -Xmx définie par l’utilisateur. La section du tas réservée à la génération permanente contient toutes les données de reflection de la JVM. Vous devez ajuster la taille en conséquence si votre application charge et décharge dynamicment un grand nombre de classes afin d’optimiser les performances. Fondamentalement, il stocke les objects et le perm gen conserve des informations sur les objects à l’intérieur. Par conséquent, plus le tas est grand, plus la permenabilité doit être grande.

Par défaut, MaxPermSize sera 32mb pour -client et 64mb pour -server. Cependant, si vous ne définissez pas à la fois PermSize et MaxPermSize, le segment de mémoire n’augmentera pas, sauf si vous en avez besoin. Lorsque vous définissez à la fois PermSize et MaxPermSize, par exemple, 192 Mo, l’espace de segment de mémoire supplémentaire sera alloué au démarrage et restra alloué.

Vous voulez peut-être donner à votre utilisateur la possibilité de stocker la quantité de mémoire de votre application, oui, le système d’exploitation a une limite et l’arrêtera de toute façon, mais peut-être que l’utilisateur pourra le limiter dans les parameters des applications. faire d’autres choses avec cette mémoire plus tard dans la journée sans planter votre application car elle a déjà occupé cet espace et ne peut pas la libérer car elle l’utilise. Donc, dans le menu des parameters, vous avez un curseur “quantité maximale de mémoire que nous utilisons” et ils peuvent l’ajuster pour ajuster le MaxPermSize .

En ayant le paramètre MaxPermSize, votre application lancera l’erreur GC Out of Memory au démarrage, de sorte que vous ne pensez pas que votre application est opérationnelle et que vos clients appellent car le système ne fonctionne pas ou est très lent.

Disons que vous avez 4 Go sur votre VM et vous savez que vous avez besoin de 2 Go d’espace non-perm pour que votre application atteigne les mesures de performance convenues contractuellement. Si votre génération doit absorber plus de 2 Go, il ne sert à rien de démarrer l’application, car vous ne serez pas en mesure de respecter les mesures de performances répertoriées dans votre cahier des charges.

Il est préférable de le savoir au démarrage, d’obtenir plus de mémoire dans la boîte, ou de reconfigurer votre VM pour prendre plus de mémoire physique du serveur (quel que soit le cas) plutôt que de lancer l’application, autoriser les classes, ehcache, etc. sinon, tout se passe bien, puis informez vos clients que le système prend 10 secondes pour charger une page.