Question

J'utilise beaucoup d'objets SimpleDateFormat-dans mon Servlet. Malheureusement, SimpleDateFormat n'est pas thread-safe. Ainsi, je pensais à envelopper wih ThreadLocal pour favoriser la réutilisation des SimpleDateFormat-objets. J'ai écrit une util-classe pour permettre à ceci:

public class DateUtil {
    private final static ThreadLocal<SimpleDateFormat> dateFormat = new ThreadLocal<SimpleDateFormat>() {
        return new SimpleDateFormat();
    }

    public static SimpleDateFormat get () {
        return dateFormat.get();
    }
}

En fait, cela semble conduire à une fuite de mémoire. Lors de l'arrêt de mon webapp, Tomcat enregistre le message d'erreur suivant:

  

GRAVE: L'application web [] créé un ThreadLocal avec la clé de type [null] (valeur [com.example.util.DateUtil$2@50242f7d]) et une valeur de type [java.text.SimpleDateFormat] (valeur [ java.text.SimpleDateFormat@d91b489b]) mais n'a pas réussi à l'enlever lorsque l'application Web a été arrêté. Ceci est très susceptible de créer une fuite de mémoire.

Je comprends la raison de la mémoire fuite, mais quelle est la meilleure façon de gérer les objets SimpleDateFormat (ou tout autre objet de sécurité non-fil) dans Servlets?

Était-ce utile?

La solution

En plus d'utiliser une implémentation alternative ( commons-lang ou joda ) il suffit de créer une nouvelle instance de SimpleDateFormat chaque fois que vous ce à l'utiliser.

Je me rends compte que cela va vous faire sentir sale et dans le besoin d'un bain, mais il est très simple et ne nécessite aucun effort de votre part. L'inconvénient est que vous retournerez un peu plus de mémoire qu'auparavant mais dans la plupart des applications web normales, vous êtes probablement à l'avis contre le bruit de JDBC.

Voir ma réponse à ThreadLocal ressources fuite et WeakReference

Autres conseils

Créer des objets locaux ou utiliser FastDateFormat (FastDateFormat est une version rapide et sûre fil de SimpleDateFormat.) de commons-lang. Et Joda-temps est une réponse commune à toutes les questions relatives à la date; -)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top