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
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
catalina.sh est :
JAVA_OPTS="$JAVA_OPTS -server -XX:PermSize=128M -XX:MaxPermSize=512m"
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 !