log4j로 인한 톰캣 메모리 누수(쓰레드 중지 실패) 이유와 해결법
-
게시물 수정 , 삭제는 로그인 필요
안녕하세요 주니어 개발자입니다.
톰캣 log4j.properties에서 log4j2.xml로 로거를 변경하려고 하는데 톰캣을 끌 때 아래와 같은 에러가 납니다.
이유가 뭐고 해결 방법은 무엇인지 첨언해 주실 분 없을까요?
톰캣 9 버전이고 jdk는 8입니다. 프레임워크는 스트러츠2입니다.
27-Oct-2023 18:23:54.963 심각 [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks 웹 애플리케이션 [웹 애플리케이션 이름1]이(가), 타입 [java.lang.ThreadLocal.SuppliedThreadLocal]인 키와 (값: [java.lang.ThreadLocal$SuppliedThreadLocal@2debecdd]) 타입 [org.apache.logging.log4j.internal.DefaultLogBuilder]인 값을 (값: [org.apache.logging.log4j.internal.DefaultLogBuilder@74019fa0]) 사용하여 ThreadLocal 객체를 생성했지만, 웹 애플리케이션이 중지될 때 그것을 제거하지 못했습니다. 혹시 있을 법한 메모리 누수를 방지하기 위하여, 시간을 두고 쓰레드들을 재생성할 것입니다. 27-Oct-2023 18:23:54.994 경고 [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads 웹 애플리케이션 [웹 애플리케이션 이름2]이(가) [Log4j2-TF-3-Scheduled-1](이)라는 이름의 쓰레드를 시작시킨 것으로 보이지만, 해당 쓰레드를 중지시키지 못했습니다. 이는 메모리 누수를 유발할 가능성이 큽니다. 해당 쓰레드의 스택 트레이스: sun.misc.Unsafe.park(Native Method) java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215) java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078) java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093) java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809) java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) java.lang.Thread.run(Thread.java:748) 27-Oct-2023 18:23:54.994 심각 [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks 웹 애플리케이션 [웹 애플리케이션 이름2]이(가), 타입 [java.lang.ThreadLocal.SuppliedThreadLocal]인 키와 (값: [java.lang.ThreadLocal$SuppliedThreadLocal@6e7a4e3a]) 타입 [org.apache.logging.log4j.internal.DefaultLogBuilder]인 값을 (값: [org.apache.logging.log4j.internal.DefaultLogBuilder@23c0b6b]) 사용하여 ThreadLocal 객체를 생성했지만, 웹 애플리케이션이 중지될 때 그것을 제거하지 못했습니다. 혹시 있을 법한 메모리 누수를 방지하기 위하여, 시간을 두고 쓰레드들을 재생성할 것입니다.
톰캣 log4j.properties에서 log4j2.xml로 로거를 변경하려고 하는데 톰캣을 끌 때 아래와 같은 에러가 납니다.
이유가 뭐고 해결 방법은 무엇인지 첨언해 주실 분 없을까요?
톰캣 9 버전이고 jdk는 8입니다. 프레임워크는 스트러츠2입니다.
27-Oct-2023 18:23:54.963 심각 [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks 웹 애플리케이션 [웹 애플리케이션 이름1]이(가), 타입 [java.lang.ThreadLocal.SuppliedThreadLocal]인 키와 (값: [java.lang.ThreadLocal$SuppliedThreadLocal@2debecdd]) 타입 [org.apache.logging.log4j.internal.DefaultLogBuilder]인 값을 (값: [org.apache.logging.log4j.internal.DefaultLogBuilder@74019fa0]) 사용하여 ThreadLocal 객체를 생성했지만, 웹 애플리케이션이 중지될 때 그것을 제거하지 못했습니다. 혹시 있을 법한 메모리 누수를 방지하기 위하여, 시간을 두고 쓰레드들을 재생성할 것입니다. 27-Oct-2023 18:23:54.994 경고 [main] org.apache.catalina.loader.WebappClassLoaderBase.clearReferencesThreads 웹 애플리케이션 [웹 애플리케이션 이름2]이(가) [Log4j2-TF-3-Scheduled-1](이)라는 이름의 쓰레드를 시작시킨 것으로 보이지만, 해당 쓰레드를 중지시키지 못했습니다. 이는 메모리 누수를 유발할 가능성이 큽니다. 해당 쓰레드의 스택 트레이스: sun.misc.Unsafe.park(Native Method) java.util.concurrent.locks.LockSupport.parkNanos(LockSupport.java:215) java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.awaitNanos(AbstractQueuedSynchronizer.java:2078) java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:1093) java.util.concurrent.ScheduledThreadPoolExecutor$DelayedWorkQueue.take(ScheduledThreadPoolExecutor.java:809) java.util.concurrent.ThreadPoolExecutor.getTask(ThreadPoolExecutor.java:1074) java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1134) java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) java.lang.Thread.run(Thread.java:748) 27-Oct-2023 18:23:54.994 심각 [main] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks 웹 애플리케이션 [웹 애플리케이션 이름2]이(가), 타입 [java.lang.ThreadLocal.SuppliedThreadLocal]인 키와 (값: [java.lang.ThreadLocal$SuppliedThreadLocal@6e7a4e3a]) 타입 [org.apache.logging.log4j.internal.DefaultLogBuilder]인 값을 (값: [org.apache.logging.log4j.internal.DefaultLogBuilder@23c0b6b]) 사용하여 ThreadLocal 객체를 생성했지만, 웹 애플리케이션이 중지될 때 그것을 제거하지 못했습니다. 혹시 있을 법한 메모리 누수를 방지하기 위하여, 시간을 두고 쓰레드들을 재생성할 것입니다.