내 서블릿 내에 SimpleDateFormat 개체를 많이 사용하고 있습니다. 아쉽게도 SimpleDateFormat은 스레드로부터 안전하지 않습니다. 따라서 SimpleDateFormat 객체의 재사용을 촉진하기 위해 ThreadLocal로 포장하는 방법에 대해 생각했습니다. 나는 이것을 가능하게하기 위해 유틸리티 클래스를 작성했다 :서블릿의 SimpleDateFormat
public class DateUtil {
private final static ThreadLocal<SimpleDateFormat> dateFormat = new ThreadLocal<SimpleDateFormat>() {
return new SimpleDateFormat();
}
public static SimpleDateFormat get() {
return dateFormat.get();
}
}
사실, 이것은 메모리 누출을 초래하는 것으로 보인다. 내 웹 애플리케이션을 종료하는 경우, Tomcat은 다음과 같은 오류 메시지를 기록합니다
SEVERE : 유형의 키와의 ThreadLocal을 만들어 [] 웹 응용 프로그램 [널 (값 [[email protected]]) 및 유형 [java.text.SimpleDateFormat] 값 (value [[email protected]])을 반환하지만 웹 응용 프로그램이 중지되었을 때이를 제거하지 못했습니다. 이렇게하면 메모리 누수가 발생할 가능성이 큽니다.
나는 메모리 누수의 이유를 이해하지만 Servlet 내에서 SimpleDateFormat 객체 (또는 스레드 안전하지 않은 다른 객체)를 처리하는 가장 좋은 방법은 무엇입니까?
에 대한 내 대답을 참조하지만, 메모리 누수에 대한 이유는 무엇인가? 미리 감사드립니다. – Victor
그 이유는이 코드를 실행하는 각 요청 스레드에 대해 인스턴스 SimpleDateFormat이 보유 될 것이기 때문에 해당 인스턴스가 제거되지 않기 때문입니다. –