tuning not leak how exist java tomcat memory-leaks

java - not - Fuga de memoria de Tomcat8



java tuning tomcat (2)

Cuando trato de detener tomcat8 en Java 8, recibo algunos errores de pérdida de memoria:

org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [Abandoned connection cleanup thread] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread: java.lang.Object.wait(Native Method) java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:142) com.mysql.jdbc.AbandonedConnectionCleanupThread.run(AbandonedConnectionCleanupThread.java:40) 23-Jan-2015 08:18:10.202 WARNING [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads The web application [ROOT] appears to have started a thread named [pool-5-thread-1] but has failed to stop it. This is very likely to create a memory leak. Stack trace of thread 23-Jan-2015 08:18:10.205 SEVERE [localhost-startStop-2] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks The web application [ROOT] created a ThreadLocal with key of type [com.util.ThreadLocalProperties$1] (value [com.util.ThreadLocalProperties$1@2fafda6e]) and a value of type [java.util.Properties] (value [{}]) but failed to remove it when the web application was stopped. Threads are going to be renewed over time to try and avoid a probable memory leak.

La clase ThreadLocalProperties es:

public class ThreadLocalProperties extends Properties { private static final long serialVersionUID = -4260632266508618756L; private final ThreadLocal<Properties> localProperties = new ThreadLocal<Properties>() { @Override protected Properties initialValue() { return new Properties(); } }; public ThreadLocalProperties(Properties properties) { super(properties); } @Override public String getProperty(String key) { String localValue = localProperties.get().getProperty(key); return localValue == null ? super.getProperty(key) : localValue; } @Override public Object setProperty(String key, String value) { return localProperties.get().setProperty(key, value); } public ThreadLocal<Properties> getThreadLocal() { return localProperties; } }

Y empiezo y paro así:

@WebListener() public class GeneralListener implements ServletContextListener { ThreadLocalProperties threadLocalProperties = new ThreadLocalProperties(System.getProperties()); @Override public void contextDestroyed(ServletContextEvent arg0) { threadLocalProperties.getThreadLocal().remove(); } @Override public void contextInitialized(ServletContextEvent arg0) { System.setProperties(threadLocalProperties); } }

¿Por qué obtendría todos estos errores de fugas de memoria? Además, cuando ejecuto el apagado, no lo apaga, tengo que detener el proceso manualmente.

¿Qué está mal?


Creo que tu problema es similar a this . Cuando se vuelve a implementar la aplicación, apache la implementa de forma incremental en sí misma, donde system.gc(); no trabaje y, después de un poco de redistribución en la fase de desarrollo, el espacio generado de forma permanente se llena y se produce un error de pérdida de memoria.

Continúe reiniciando su servidor después de una pequeña redistribución, de modo que el espacio de PermGen se pueda borrar con un reinicio.

O

También puede resolverlo cambiando el espacio de PermGen en el servidor. Por favor visite here

Espero que esto ayude.


No hay nada de qué preocuparse. Este es un mensaje estándar que Tomcat genera cuando detecta que la aplicación ha iniciado su propio Thread o ha creado un ThreadLocal . Si finaliza el subproceso al cerrarse y quita las localizaciones de subprocesos cuando ya no son necesarias, no habrá ningún problema.

¿Por qué obtendría todos estos errores de fugas de memoria? Además, cuando ejecuto el apagado, no lo apaga, tengo que detener el proceso manualmente.

He visto este comportamiento, cuando una aplicación ha iniciado ScheduledExecutor (pero esto ocurrirá con cualquier otro Thread / TheadPool ) y no lo cerró en contextDestroyed . Así que verifique si está cerrando sus hilos en la aplicación / parada del servidor.

Ahora en su problema concreto por qué el servidor no se detiene: los controladores JDBC están registrados en la JVM como singletons, y se comparten con todas las aplicaciones web. Más información here. La mejor solución para su problema es mover el controlador MySQL en la carpeta /lib Tomcat. Si no puedes hacer eso, puedes intentar this pero es más como un hack que una solución real.