2011-01-10 4 views
2

내 서블릿 내에 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 객체 (또는 스레드 안전하지 않은 다른 객체)를 처리하는 가장 좋은 방법은 무엇입니까?

+0

에 대한 내 대답을 참조하지만, 메모리 누수에 대한 이유는 무엇인가? 미리 감사드립니다. – Victor

+0

그 이유는이 코드를 실행하는 각 요청 스레드에 대해 인스턴스 SimpleDateFormat이 보유 될 것이기 때문에 해당 인스턴스가 제거되지 않기 때문입니다. –

답변

5

은 당신이 무엇을 사용할 때마다 SimpleDateFormat의 새 인스턴스를 만들려면 일반적인 대답이다.

나는 이것이 당신을 더러워지고 목욕을 필요로한다는 것을 깨달았지만, 매우 간단하며 당신의 노력을 필요로하지 않습니다. 단점은 이전보다 조금 더 많은 메모리를 넘기 겠지만 대부분의 일반적인 웹 애플리케이션에서는 JDBC의 노이즈에 대해 거의 알지 못한다는 것입니다.

내가이 commnet에 질문을 할 생각 사람을 아닙니다 이해 ThreadLocal Resource Leak and WeakReference

+3

+1 더 복잡한 것들을 만들지 않기 위해서 그들은 – keuleJ

+1

입니다.'SimpleDateFormat'은 값 비싸지 만 (내부적으로'Calendar' 인스턴스를 생성합니다) 언급해야합니다. 참조 : http://stackoverflow.com/questions/4107839/synchronizing-access-to-simpledateformat – Joe23

+3

http://www.thedwick.com/blog/2008/04/simpledateformat의 사용자와 같이 비싼 것은 상대적 용어입니다. -performance-pig/당신은 아무것도하지 않고 일을하고있는 것 같지만 비쌀 수 있습니다. 그러나 jdbc/hibernate 쿼리를 실행 한 후 html 페이지에 20 개의 날짜를 넣는다면 정말 중요하지 않을 것입니다. 귀하의 프로그램이 올바른지 확인 * 먼저 * 다음 빨리. –

3

로컬 객체를 만들거나 FastDateFormat (FastDateFormat은 SimpleDateFormat의 빠른 스레드 안전 버전입니다.)을 commons-lang에서 만듭니다. 그리고 joda 시간은 모든 날짜 관련 질문 ;-) 외에 대안 구현 (commons-lang 또는 joda)를 사용에서