복붙노트

[SPRING] Tomcat 6 메모리 누수 로그 항목

SPRING

Tomcat 6 메모리 누수 로그 항목

아래는 CentOS 컴퓨터의 Catalina.out 파일에서 고유 한 항목을 처리 한 것입니다. Tomcat 6을 Spring 3와 함께 사용하고 있습니다. 그 (것)들의 전체 낱단이있다 그래서 나는 다만 반복하는 어떤을 쑤 셨다. 이것은 항상 발생하지는 않지만 적어도 일주일에 한 번 발생합니다.

Feb 3, 2011 2:37:48 PM org.apache.catalina.loader.WebappClassLoader clearReferencesJdbc

SEVERE: The web application [] registered the JBDC driver [com.mysql.jdbc.Driver] but failed to unregister it when the web application was stopped. To prevent a memory leak, the JDBC Driver has been forcibly unregistered.

Feb 3, 2011 2:37:48 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads

SEVERE: The web application [] appears to have started a thread named [com.iteezy.shared.domain.DirEntry.data] but has failed to stop it. This is very likely to create a memory leak.


Feb 3, 2011 2:37:48 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
SEVERE: The web application [] appears to have started a thread named

[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0] but has failed to stop it. This is very likely to create a memory leak.


Feb 3, 2011 2:37:48 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads  

SEVERE: The web application [] appears to have started a thread named [File Reaper] but has failed to stop it. This is very likely to create a memory leak.

Feb 3, 2011 2:37:48 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads

SEVERE: The web application [] appears to have started a thread named [pool-1-thread-22] but has failed to stop it. This is very likely to create a memory leak.  

37:48 PM org.apache.catalina.loader.WebappClassLoader clearReferencesThreads
b application [] appears to have started a thread named 

[org.springframework.scheduling.quartz.SchedulerFactoryBean#0_Worker-2] but has failed to stop it. This is very likely to create a memory leak.

37:48 PM org.apache.catalina.loader.WebappClassLoader clearThreadLocalMap

b application [] created a ThreadLocal with key of type [net.sf.json.AbstractJSON$1] (value [net.sf.json.AbstractJSON$1@40bbb3d6]) and a value of type [java.util.HashSet] (value [[]]) but failed to remove it when the web application was stopped. This is very likely to create a memory leak.

해결법

  1. ==============================

    1.스레드가 설정 될 때 폴링 및 종료한다고 가정하는 외부 플래그를 정의 할 때 휘발성이 있어야합니다. 그렇지 않으면 스레드는 다른 스레드가 변경 한 것을 결코 볼 수 없습니다.

    스레드가 설정 될 때 폴링 및 종료한다고 가정하는 외부 플래그를 정의 할 때 휘발성이 있어야합니다. 그렇지 않으면 스레드는 다른 스레드가 변경 한 것을 결코 볼 수 없습니다.

    그러나 표준 API에는 이미 이와 같은 기능이 있습니다.이 API는 interrupt () 메서드 및 Thread.currentThread (). isInterrupted ()라고합니다. 기존 논리를 복제 할 필요가 없습니다. 자세한 내용은 특정 Java 스레드 중지를 참조하십시오.

    모든 스레드가 그것에 응답한다는 보장이 없기 때문에 각각의 모든 스레드에서 interrupt ()를 호출하는 것은 나쁜 생각입니다. 예외 검사 다음 스레드가 제대로 정리되지 않는 것을 발견했습니다.

    최종선은 : 움직이는 모든 것을 죽이지 않고 (실제로이 경고를 내린 후에 Tomcat이 당신을 대신해) 스레드를 어디에서 가져 왔는지 결정하고 프레임웍 / 라이브러리에 특정한 close () 메소드를 사용하여 추가 정리를 허용한다. 부드럽게 다루십시오.

  2. ==============================

    2.Servlet을 설정하여 destroy () 메소드에서이를 관리하십시오. 스레드는 플래그를 검사하여 계속해야하는지 여부를 확인할 수 있습니다.

    Servlet을 설정하여 destroy () 메소드에서이를 관리하십시오. 스레드는 플래그를 검사하여 계속해야하는지 여부를 확인할 수 있습니다.

    서블릿에서 destroy 메소드에서 다음을 수행하십시오. 분명히 Collection 에 액세스 할 수 있어야하지만, 실제로 어떻게 얻는지는 시스템이 어떻게 설정되어 있는지에 달려 있습니다.

    destroy() {
        for (MyThread thread : myThreads) {
            thread.stopProcessing();
        }
    }
    

    MyThread 클래스는 다음과 같이됩니다.

    public class MyThread {
        private boolean finished = false;
    
        @Override
        public void run() {
            while (!finished) {
                //do something
            }
        }
    
        public void stopProcessing() {
            finished = true;
        }
    }
    
  3. ==============================

    3.웹 응용 프로그램을 올바르게 종료하십시오. 이 스레드를 실행하지 마십시오.

    웹 응용 프로그램을 올바르게 종료하십시오. 이 스레드를 실행하지 마십시오.

    또는 웹 응용 프로그램을 계속 재배포하지 마십시오.

  4. from https://stackoverflow.com/questions/4899205/tomcat-6-memory-leaks-log-entries by cc-by-sa and MIT license