SimpleDateFormat в сервлетах - PullRequest
       20

SimpleDateFormat в сервлетах

2 голосов
/ 11 января 2011

Я использую много 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 с ключом типа [null] (значение [com.example.util.DateUtil $ 2@ 50242f7d]) и значение типа [java.text.SimpleDateFormat] (значение [java.text.SimpleDateFormat@d91b489b]), но не удалось удалить его при остановке веб-приложения.С большой вероятностью это может привести к утечке памяти.

Я понимаю причину утечки памяти, но каков наилучший способ обработки объектов SimpleDateFormat (или любых других не поточно-ориентированных объектов)?) внутри сервлетов?

Ответы [ 2 ]

5 голосов
/ 11 января 2011

Помимо использования альтернативной реализации ( commons-lang или joda ), просто создайте новый экземпляр SimpleDateFormat каждый раз, когда вы его используете.

Я понимаю, что это заставит вас чувствовать себя грязно и нуждаться в ванне, но это очень просто и не требует никаких усилий с вашей стороны. Недостатком является то, что вы перевернете немного больше памяти, чем раньше, но в большинстве обычных веб-приложений вы вряд ли заметите на фоне шума JDBC.

См. Мой ответ на Утечка локальных ресурсов и слабая ссылка

3 голосов
/ 11 января 2011

Создание локальных объектов или использование FastDateFormat (FastDateFormat - это быстрая и поточно-ориентированная версия SimpleDateFormat.) Из commons-lang.И Joda-Time является общим ответом на все вопросы, связанные с датой; -)

...