2013-02-14 2 views
4

org.apache.catalina.core.ThreadLocalLeakPreventionListener에 대한 문서에서 "스레드 로컬 관련 메모리 누수를 방지하기 위해 컨텍스트가 중지 될 때 Executor 풀의 스레드 갱신을 트리거하는 LifecycleListener"라는 메시지가 표시됩니다.바람둥이의 ThreadLocalLeakPreventionListener는 정확히 무엇을합니까?

어떻게 ThreadLocal 메모리 누출을 방지 할 수 있습니까? 문맥이 정지했을 때에 명시 적으로 ThreadLocal의 remove() 메소드를 호출합니까?

내가 아는 한 ThreadLocal은 해시 맵으로 구현됩니다. 맵 키는 ThreadLocal 인스턴스 자체에 대한 참조입니다. 맵 값은 스레드 로컬 값입니다.

+1

[소스] (http://grepcode.com/file/repo1.maven.org/maven2/org.apache.tomcat/tomcat-catalina/7.0.14/org/apache/catalina/)를 읽어 보았습니까? core/ThreadLocalLeakPreventionListener.java)? –

답변

9

처음 몇 가지 설명. ThreadLocal 응용 프로그램 내부에 ThreadLocal에 사용자 정의 클래스를 배치하고 ThreadLocal을 먼저 지우지 않고 해당 응용 프로그램을 배포 취소/재배포하면 누출이 발생합니다. 이 경우 스레드는 여전히 클래스에 대한 참조를 보유합니다.이 클래스는 ClassLoader에 대한 참조를 보유합니다.이 참조는 (이미 배포 취소 된) 웹 응용 프로그램에 의해로드 된 다른 모든 클래스에 대한 참조를 보유합니다.

ThreadLocal 값이 실제로 스레드 안에 저장되어 있기 때문에 스레드는 여전히 개체에 대한 참조를 보유합니다. ThreadLocal을 지우지 않으면 실행되는 동안이 특정 값이 Thread 오브젝트에 의해 보유됨을 의미합니다.

질문에 다시 - ThreadLocal 일부를 제거하는 것을 잊었을 경우 풀 스레드에서 영원히 참조됩니다. Tomcat이 방지하려고 시도하는 것입니다. 누출이 의심 될 경우 새 스레드를 만들고 종료합니다. 웹 응용 프로그램에는 보이지 않지만 풀 스레드를 중지하고 새 스레드로 대체하면 이전 스레드는 클래스, 클래스 로더 및 기타 모든 항목을 참조하는 마지막 객체가됩니다. 마지막으로 ThreadLocal 값은 GC에 적합합니다.

+0

Tomasz 대단한 답변에 감사드립니다. 나는 바람둥이가 "의심되는 누출"이 정확히 정확히 무엇인지 궁금해합니다. 스레드의 유휴 시간을 모니터링합니까? 스레드가 응답했는지, 예외가 발생했는지 등을 모니터합니까? – Sumit

+0

@Sumit : 불행히도 나는 모른다. 하지만 배포되지 않은 동안 모든 스레드 풀과'ThreadLocal'을 검사해야한다고 생각합니다. –

관련 문제