Pourquoi MaxPermSize existe-t-il?
Voici un bon article sur la génération permanente dans le ramasse-miettes:
Présentation de la génération permanente sur Weblog de Jon Masamitsu
MODIFIER:
Je n'ai rien vu qui puisse indiquer pourquoi ils ont pris la décision de conception de limiter au maximum la taille de la génération permanente. Mais j'imagine que cela a été fait pour plusieurs raisons.
Cela facilite grandement la mise en œuvre, les GC étant décidément non triviaux, simplifier votre implémentation de quelque manière que ce soit est probablement une bonne idée.
YAGNI (vous n’en aurez pas besoin) la plupart des applications chargent un nombre fixe de classes et ne sont généralement pas très volumineuses; elles ont donc probablement été optimisées pour le cas courant, elles ont simplement choisi un défaut par défaut et l’ont laissé configurable.
En supposant que votre taille permanente augmente de façon imprévisible, vous avez probablement une erreur dans un chargeur de classe (ou vous devez repenser votre architecture). Même dans les applications qui génèrent des classes au moment de l'exécution (ou qui réalisent d'autres astuces), le nombre de classes générées est généralement également corrigé. Vous devriez donc pouvoir ajuster maxperm en fonction de vos besoins.
Je ne suis pas un expert des détails du chargement des classes Java et du ramassage des ordures, mais ils font tous deux partie compliquée de la machine virtuelle. J'imagine qu'ils essaieraient de maintenir ces deux composants aussi orthogonaux que possible, tout en permettant à la génération de se développer. de manière dynamique couplerait probablement ces deux composants de manière complexe (en particulier parce que les deux composants ont des considérations sérieuses de threading)
Limiter le nombre maximal de permanentes offre probablement des avantages en termes de performances. Son développement peut impliquer une copie supplémentaire de la collection ou peut signifier que votre génération de permanentes n'existe plus dans un espace d'adressage contigu, ce qui pourrait affecter le fonctionnement de vos autres algorithmes. travailler pour gérer la collection.
Évidemment, ce sont toutes des spéculations. Mais même si tout cela est faux, je ne pense vraiment pas que ce soit «idiot» pour Sun 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 un point de vue légèrement différent, la machine virtuelle Java IBM n’a pas de statut, mais se connecte plutôt au système d’exploitation et alloue des blocs de mémoire selon ses besoins. (La rumeur dit que jrockit fait la même chose, mais je ne peux pas confirmer avec certitude.)
Ceci est avantageux en ce sens que vous n'allez pas atteindre une limite (apparemment) arbitraire et que vous devez l'adapter aux situations de croissance légitimes.
D'un autre côté, c'est un problème pour les applications en fuite (qui fuient essentiellement les classes) - la JVM va essentiellement utiliser toute la mémoire de l'espace d'adressage. Cela peut entraîner des problèmes, où le code natif va soudainement échouer, les appels malloc (), ou Java se brouiller de manière étrange - comme l'impossibilité d'allouer de nouveaux threads (ce qui consomme de la mémoire pour la pile). Un autre inconvénient est qu’elle ne fournit pas une "certitude de coût" quant à la quantité de mémoire consommée par la machine virtuelle Java.
C'est donc un compromis - comment voulez-vous échouer dans des scénarios de "méchanceté potentielle"?
Si vous définissez MaxPermSize, votre application génère une 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.
Supposons que vous avez 4 Go sur votre VM et que vous savez que vous avez besoin de 2 Go d'espace non permanent pour que votre application atteigne les métriques de performance convenues par contrat. Si votre perm gen va prendre plus de 2 Go, il est inutile de démarrer l'application, car vous ne pourrez pas respecter les mesures de performance répertoriées dans votre énoncé de travail.
Il est préférable de le savoir au démarrage et de disposer de plus de mémoire dans la boîte, ou de reconfigurer votre VM pour utiliser davantage de mémoire serveur physique (quel que soit le cas) que de démarrer l'application, autorisez les classes, ehcache, ou ce que vous chargez de charger, pense que tout va bien, puis informez vos clients que le système prend 10 secondes pour charger une page.
Son utilisé pour dimensionner la génération permanente maximale. Dans certains algos ou si vous utilisez beaucoup, beaucoup de classes différentes, vous pouvez utiliser ceci. Donnez celui-ci une lecture.
Mais surtout, il est utilisé comme 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 génération permanente est utilisée pour refléter la VM elle-même, telle que les objets de classe et les objets de méthode. Ces objets réfléchissants sont directement affectés à la génération permanente et sont 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 segment réservée à la génération permanente contient toutes les données de réflexion de la machine virtuelle. Vous devez ajuster la taille en conséquence si votre application charge et décharge dynamiquement un grand nombre de classes afin d'optimiser les performances. En gros, il stocke les objets et la perm gen conserve des informations sur les objets qu’il contient. Par conséquent, plus le tas est grand, plus la permenabilité doit être grande.
Par défaut, MaxPermSize sera 32 Mo pour -client et 64 Mo pour -server. Toutefois, si vous ne définissez pas à la fois PermSize et MaxPermSize, le segment de mémoire global n'augmentera pas sauf si cela est nécessaire. Lorsque vous définissez PermSize et MaxPermSize, par exemple, 192 Mo, l'espace de tas supplémentaire sera alloué au démarrage et restera alloué.
Vous voulez peut-être donner à votre utilisateur l’option sur la quantité de mémoire utilisée par 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 souhaite pouvoir la limiter dans les paramètres de l’application afin de pouvoir effectuez d'autres tâches avec cette mémoire plus tard dans la journée sans planter votre application, car il s'agit deDÉJÀqui occupe cet espace et ne peut pas le libérer car il l'utilise. Ainsi, dans le menu des paramètres, vous avez un curseur "quantité maximale de mémoire, nous utilisons" et ils peuvent l’ajuster de manière à ajuster la valeur MaxPermSize
.