2012-07-12 13 views
5

Ovviamente a un certo punto un oggetto viene creato e distrutto/restituito al pool. Sono particolarmente interessato a come vengono raccolti i rifiuti. C'è un modo per controllare questo comportamento? In particolare, una chiamata a invalidate() contrassegnerà questi oggetti per la raccolta? Quando rilasciano i riferimenti memorizzati in essi?Qual è il ciclo di vita di un oggetto HttpSession di Java?

Più dettagli sono e meglio è.

risposta

8

HttpSession è fondamentalmente una mappa dalla chiave di stringa a qualche valore arbitrario. Ogni volta che crei una sessione (accedendo a JSP o chiamando getSession()/getSession(true)), il contenitore genera un ID di sessione stringa univoco e contiene un riferimento a quell'oggetto HttpSession. Di nuovo, utilizzerà una mappa dall'ID di sessione all'oggetto HttpSession.

Una volta inserito qualcosa nella sessione, il contenitore contiene un riferimento a quella sessione e la sessione contiene un riferimento all'oggetto. Rimarrà lì per un po 'di tempo. Ci sono tre situazione quando il vostro oggetto sarà rimosso dalla sessione:

  1. Quando si rimuove in modo esplicito (removeAttribute() o setAttribute(null))

  2. Quando si invalidate() l'intera sessione. In pratica rimuove tutti gli attributi e rimuove l'intera sessione dalla mappa di sessione gestita dal contenitore

  3. Quando scade la sessione (stesso comportamento di 2.) Ciò si verifica quando nessuna sessione servlet/JSP accede in un intervallo di tempo configurabile (ad esempio 10 minuti)

il momento in cui un oggetto viene rimosso dalla sessione (uno dei punti di cui sopra) e nessun altro codice contiene un riferimento a tale oggetto, è idonea per la raccolta dei rifiuti e verrà rimosso durante successiva esecuzione GC .


È possibile aggiungere un oggetto che implementa HttpSessionBindingListener a un HttpSession per osservare alcuni dei comportamenti di cui sopra. Un oggetto che implementa questa interfaccia potrebbe, ad esempio, stampare un messaggio di log quando non è associato alla sessione.

È possibile controllare il documentation here.

1

Penso che questo dipenda dal contenitore utilizzato, dalla domanda di implementazione.

Problemi correlati