2013-05-27 9 views
9

ho read che il seguente codice porta ad una perdita di memoria come la classe livello contiene un riferimento al membro CUSTOMLEVEL da fuori Classloader:perdita di memoria causata da Logger

public class LeakServlet extends HttpServlet { 
    private static final String STATICNAME = "This leaks!"; 
    private static final Level CUSTOMLEVEL = new Level("test", 550) {}; // anon class! 

    protected void doGet(HttpServletRequest request, HttpServletResponse response) 
       throws ServletException, IOException { 
     Logger.getLogger("test").log(CUSTOMLEVEL, "doGet called"); 
    } 
} 

La domanda è: come è la classe di Livello caricato fuori da questo particolare classloader?
Posso avere altre istanze all'interno dell'API java con un comportamento simile?

+0

"come viene caricata la classe Level fuori da questo particolare programma di caricamento classi?" - Le classi standard di solito vengono caricate utilizzando il classloader di sistema tramite la gerarchia di classloader. Non sono sicuro che ci sia una perdita qui, comunque. Potresti fornire un riferimento al documento che dice che ce n'è uno? –

+0

Non preoccuparti: lo trovi qui: http://frankkieviet.blogspot.com/2006/10/classloader-leaks-dreaded-permgen-space.html –

+0

[Qui] (http://bugs.sun.com/ view_bug.do?bug_id=6543126) –

risposta

2

Ci sono molte fonti per perdite di caricatore di classe: This part di una serie di blog sul problema, enumera alcuni dei colpevoli.