java - change - tomcat 9 increase memory
¿Puedo reiniciar automáticamente tomcat jvm en una excepción de memoria insuficiente (6)
Sé que esto no es una "mejor práctica", pero me gustaría saber si puedo reiniciar Tomcat automáticamente si mi aplicación implementada produce una excepción fuera de la memoria
¿Qué pasa con algo como esto? -XX:OnOutOfMemoryError="exec /`ps --no-heading -p $$ -o cmd/`"
En general, no. La máquina virtual es un mal estado y no se puede confiar completamente.
Por lo general, uno puede usar un proceso de envoltura configurable que inicie y detenga la máquina virtual "real" del servidor que desee. Un ejemplo con el que he trabajado es "Java Service Wrapper" de Tanuki Software http://wrapper.tanukisoftware.com/doc/english/download.jsp
Sé que hay otros.
Para protegerse contra los OOM en primer lugar, hay formas de instrumentar máquinas virtuales modernas a través de beans de interfaz para consultar el estado del montón y otras estructuras de memoria. Se pueden usar para, por ejemplo, advertir en un registro o un correo electrónico si algunas operaciones específicas de la aplicación están superando algunos límites establecidos.
Lamentablemente cuando matas el proceso java. Su script mantendrá una referencia a los puertos tomcat 8080 8005 8009 y no podrá volver a iniciarlo desde el mismo script. La única forma en que funciona para mí es:
-XX: OnOutOfMemoryError = "kill -9% p" y luego otro cron o monit o algo similar para asegurarse de que el tomcat vuelva a funcionar.
% p es en realidad el JVM pid, algo que JVM le proporciona.
Puede intentar usar la opción JVM de OnOutOfMemoryError
-XX:OnOutOfMemoryError="/yourscripts/tomcat-restart"
También es posible generar el volcado de pila para un análisis posterior:
-XX:+HeapDumpOnOutOfMemoryError
Tenga cuidado al combinar estas dos opciones. Si fuerza el proceso de eliminación en "tomcat-restart", es posible que el volcado de almacenamiento no esté completo.
Sé que esto no es lo que preguntaste, pero ¿has intentado mirar a través de un basurero para ver dónde puedes estar perdiendo memoria?
Algunas herramientas muy útiles para localizar pérdidas de memoria:
jdk/bin/jmap -histo:live pid
Esto le dará un histograma de todos los objetos vivos actualmente en la JVM. Busque cualquier recuento de objetos impares. Tendrá que conocer su aplicación bastante bien para poder determinar qué recuentos de objetos son impares.
jdk/bin/jmap -dump:live,file=heap.hprof pid
Esto volcará todo el montón de la JVM identificada por pid. Luego, puede usar el gran analizador de memoria Eclipse para inspeccionarlo y averiguar quién mantiene las referencias de sus objetos. Sus dos amigos más grandes en Eclipse Memory Analyzer son el histograma y un right click -> references -> exclude weak/soft references
para ver qué hace referencia a su objeto.
jconsole es, por supuesto, otra buena herramienta.
no es fácil, y definitivamente no a través de la JVM que acaba de sufrir la excepción de memoria insuficiente. Su mejor apuesta sería una combinación de monitor de estado de Tomcat junto con scripts cron o scripts de administrador de sistema programados relacionados; algo para comprobar el estado del servidor y detener y reiniciar automáticamente el servicio si ha fallado.