Este artículo analiza las razones por las cuales el desbordamiento de memoria del programa Java es más detallado. Compártelo para todos para su referencia. Los detalles son los siguientes:
Encontrado un sistema en línea reportado Java.lang.OutOfMemoryError: Error de espacio de Permgen, debe localizar el problema. Obtuve esto hace mucho tiempo, y realmente no lo recuerdo ahora, pero esta es una pregunta muy interesante. En primer lugar, la primera reacción es agregar los parámetros -xx:+printgcdetails para mirar los registros de GC específicos, pero debido a que el programa está iniciado por Tomcat, me preocupa que haya demasiadas cosas encapsuladas por dentro.
Luego, echemos un vistazo a la causa de este error.
El nombre completo del espacio de Permgen es el espacio de generación permanente, que se refiere al área de preservación permanente de la memoria. Diferentes regiones de montón. coloca pre -compile en JSP. Si usa una gran cantidad de JAR de tercera parte en su aplicación web, el tamaño excede el tamaño predeterminado (4 m) del JVM, entonces se generará este mensaje de error.
Entonces aumentemos el tamaño de memoria inicial de Permgen:
Agregue al comienzo de Linux al comienzo del archivo Catalina.Sh: Copiar código de código de la siguiente manera: java_opts = "-xms1024m -xmx1024m -xx: permSize = 256m -xx: maxPermsize = 256m" "" "" "
Además, al comienzo del archivo de Catalina.Bat en Windows: Copiar código de código de la siguiente manera: Establecer java_opts = -xms1024m -xmx1024m -xx: permSize = 256m -xx: maxPermsSize = 256m
Luego todavía usamos la memoria visual para ver las herramientas para localizar problemas específicos. La herramienta preferida para JDK6 es, por supuesto, sus propias herramientas. Esta vez encontré otro problema extraño, es decir, el proceso Tomcat no se pudo encontrar después de que se abrió la herramienta de análisis (se descubrió que JRE se inició después, y debería ser suficiente para cambiarla a JDK).
Dado que el área local no está permitida, puedo conectarme de forma remota, solo abrir JMX.
Al igual que lo anterior, agregue el código de código de copia al comienzo del archivo Java_opts de Catalina.Sh.Sh o Catalina.Bat de la siguiente manera: -djava.rmi.server.hostname = 192.168.1.101-dcom.management.jmxremote.port = 900 0-- dcom.sun.management.jmxremote.ssl = false -dcom.sun.management.jmxremote.authenticate = falso
Después de comenzar el programa, verifique si el puerto se abre correctamente para asegurarse de que el control remoto pueda conectarse.
Soy perezoso aquí y apago la autenticación. Esta configuración es efectiva en mi PC local, pero no es suficiente en el servidor. Abra jVisualVM, haga clic en Archivo-> Agregar conexión JMX y luego agregue LocalHost: 1000 y conéctese.
Después del programa anterior, observar el cambio de memoria por un período de tiempo, me concentré en la situación de Perm. Puede ser que el tamaño de la memoria permanente no haya tenido efecto antes, porque la inicialización predeterminada de Perm es de 16 m y el máximo es de 64 m, y el monto de la ocupación real puede causar este problema. . Si necesita localizar el problema aún más, también puede usar BTRACE para ver un lugar donde se llame a cierto método. Esto puede posicionarse si ciertos métodos se ejecutan como se esperaba.
Se espera que este artículo sea útil para el diseño del programa Java de todos.