Maison > Java > javaDidacticiel > Solution de débordement de mémoire JVM (comment résoudre le débordement de mémoire JVM)

Solution de débordement de mémoire JVM (comment résoudre le débordement de mémoire JVM)

高洛峰
Libérer: 2017-01-23 10:09:23
original
1236 Les gens l'ont consulté

java.lang.OutOfMemoryError: PermGen space

J'ai découvert que de nombreuses personnes attribuent le problème à : spring, hibernate, tomcat, car ils génèrent dynamiquement des classes, provoquant le débordement du tas permanent de la JVM. Ensuite, il existe différentes solutions. Certaines personnes disent de mettre à niveau la version de Tomcat vers la dernière version ou même de ne pas utiliser Tomcat du tout. Certaines personnes doutent également du problème de Spring, et les discussions sur le forum Spring sont très intenses, car Spring utilise CBLIB dans AOP pour générer dynamiquement de nombreuses classes.
Mais la question est de savoir pourquoi ces projets open source de premier plan ont le même problème. Est-ce une raison plus fondamentale ? Tomcat a répondu à ce point de manière très implicite dans les questions-réponses. Nous sommes conscients de ce problème, mais cette question découle d'une question plus fondamentale.
Alors quelqu'un a vérifié la JVM la plus basique et a trouvé la clé du problème. Il s'avère que la JVM de SUN divise la mémoire en différentes zones, dont l'une est la zone permenter, qui est utilisée pour stocker les classes et les descriptions de classes fréquemment utilisées. Lorsque SUN l'a conçu à l'origine, il pensait que cette zone serait corrigée au démarrage de la JVM, mais il ne s'attendait pas à ce que cette dynamique soit si largement utilisée maintenant. De plus, cette zone dispose d'un mécanisme spécial de récupération de place. Le problème est maintenant qu'après avoir chargé dynamiquement les classes dans cette zone, GC ne peut pas du tout les collecter !

1. Le premier est : java.lang.OutOfMemoryError : espace du tas Java

Explication :

Paramètre de la taille du tas

Le paramètre du tas JVM fait référence à java Lors de l'exécution du programme, la JVM peut allouer les paramètres de l'espace mémoire utilisé. La JVM définira automatiquement la valeur de la taille du tas lors de son démarrage. Son espace initial (c'est-à-dire -Xms) est de 1/64 de la mémoire physique. , et l'espace maximum (-Xmx) est de 1/4 de la mémoire physique. Vous pouvez utiliser -Xmn -Xms -Xmx et d'autres options fournies par la JVM pour le définir. La taille du tas est la somme de la jeune génération et de la génération titulaire.
Astuce : dans la JVM, ce message d'exception sera généré si 98 % du temps est utilisé pour le GC et que la taille du tas disponible est inférieure à 2 %.
Conseil : la taille maximale du tas ne doit pas dépasser 80 % de la mémoire physique disponible. Généralement, les options -Xms et -Xmx doivent être définies sur la même valeur et -Xmn doit être 1/4 de la valeur -Xmx. .

Solution :

Définissez manuellement la taille du tas
Modifiez TOMCAT_HOME/bin/catalina.bat et ajoutez la ligne suivante au-dessus de "echo "Using CATALINA_BASE: $CATALINA_BASE"":

set JAVA_OPTS=%JAVA_OPTS% -server -Xms800m -Xmx800m -XX:MaxNewSize=256m
Copier après la connexion

Ou modifiez catalina.sh
Ajoutez la ligne suivante au-dessus de "echo "Using CATALINA_BASE: $CATALINA_BASE"":

JAVA_OPTS="$JAVA_OPTS -server -Xms800m -Xmx800m -XX:MaxNewSize=256m" 
[html]
2、其次是:java.lang.OutOfMemoryError: PermGen space
原因:
PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被放到PermGen space中,它和存放类实例(Instance)的Heap区域不同,GC(Garbage Collection)不会在主程序运行期对PermGen space进行清理,所以如果你的应用中有很CLASS的话,就很可能出现PermGen space错误,这种错误常见在web服务器对JSP进行pre compile的时候。如果你的WEB APP下都用了大量的第三方jar, 其大小超过了jvm默认的大小(4M)那么就会产生此错误信息了。
解决方法:
1. 手动设置MaxPermSize大小 
修改TOMCAT_HOME/bin/catalina.bat(Linux下为catalina.sh),在
[code]
“echo "Using CATALINA_BASE: $CATALINA_BASE"”上面加入以下行: 
set JAVA_OPTS=%JAVA_OPTS% -server -XX:PermSize=128M -XX:MaxPermSize=512m
Copier après la connexion

catalina.sh est :

JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m"
Copier après la connexion

Pour plus d'articles sur les solutions de débordement de mémoire JVM (comment résoudre le débordement de mémoire JVM), veuillez faire attention au site Web PHP chinois !

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal