2013-05-27 21 views
9

I read że następujący kod prowadzi do wycieku pamięci jako klasy szczebla posiada odniesienie do członka CUSTOMLEVEL spoza classloader:wyciek pamięci spowodowane przez 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"); 
    } 
} 

Pytanie, jak to klasa Level ładowane poza tym konkretnym programem ładującym klasy?
Czy mogę mieć inne wystąpienia w interfejsie API Java podobnego zachowania?

+0

"w jaki sposób klasa poziomu jest ładowana poza tym konkretnym programem ładującym klasy?" - klasy standardowe ładowane są zwykle za pomocą systemowego programu ładującego klasy za pośrednictwem hierarchii programów ładujących klasy. Nie jestem jednak pewien, czy jest tu przeciek. Czy możesz podać odniesienie do dokumentu, który mówi, że taki istnieje? –

+0

Nie przejmuj się - znajdziesz to tutaj: http://frankkieviet.blogspot.com/2006/10/classloader-leaks-dreaded-permgen-space.html –

+0

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

Odpowiedz

2

Istnieje wiele źródeł wycieków programu ładującego klasy: This part z serii blogów na ten temat, wylicza niektóre z winowajców.