2012-04-20 9 views
5

1) Jeśli użyję następującej Class.forName() jest wywoływana wiele razy, spowoduje to wycieki pamięci?Czy wielokrotne użycie klasy class.forname spowoduje wyciek pamięci? (działa wewnątrz tomcat)

Class.forName("MyClass") 

2) Czy jest WebAppClassLoader Tomcat zamiar sprawdzić, czy "MyClass" jest już załadowany i korzystać z pamięci podręcznej zamiast instancji.

3) Jeśli odpowiedź na pytanie (2) brzmi "nie", to czy poprzednio załadowana klasa otrzyma śmieci zebrane, jeśli włączono PermGen zamiatanie i ustaw odpowiednie parametry jvm.

Jeśli chcę uniknąć ponownego ładowania klasy, jaki jest najlepszy sposób korzystania z pamięci podręcznej klas. Mogę zapisać jako instancję klasy HashMap

+0

Nie sądzę, że powinien przeciekać pamięć, dopóki jest ładowana z tego samego programu ładującego klasy. Zmiana głośności ClassLoader również wydaje się mało prawdopodobna. –

Odpowiedz

9

1) Nie, jedna definicja klasy jest ładowana tylko raz przez dowolny program ładujący klasy. Następnie jest przechowywany w pamięci (w przestrzeni PermGen) i ponownie wykorzystywany na kolejnych odniesieniach do klasy, aż do załadowania programu ładującego klasy. Jest to niezależne od tego, w jaki sposób odwołuje się do klasy: przez Class.forName, ClassLoader.loadClass lub cokolwiek innego.

Ta sama definicja klasy może zostać załadowana do różnych modułów ładujących wiele razy (co powoduje, że wiele tokenów klas w pamięci). Są one liczone jako zupełnie różne klasy, których nie można rzutować na siebie, nawet jeśli zostały załadowane z dokładnie tego samego pliku klasy.

2) Tak

3) N/A

4) odwołanie artykuł wspomina, że ​​klasa jest załadowany w innym classloader, więc moje wyjaśnienie w pkt 1) stosuje.

+0

Przypuszczam, że to będzie używać tego samego programu ładującego klasy, który będzie programem ładującym klasy aplikacji WWW dostarczonym przez tomcat. –

+1

@samarjitsamanta, najprawdopodobniej tak, chociaż nie jestem ekspertem Tomcat, więc nie wierz mi na słowo :-) –

+0

tak, odpowiedź na pytanie czwarte była trochę głupią częścią mnie, która pomieszała ładowanie klasy i instancję klasy:) Zdałem sobie z tego sprawę i usunąłem pytanie, które jest nieistotne. dzięki za szybką odpowiedź. –

0

z dokumentacji:

Zwraca obiekt klasy powiązanych z klasy lub interfejsu z danej nazwy strun.

Nie widzę żadnego wskazania, że ​​zajęcia powinny zostać ponownie załadowane. Po prostu zwraca go, informując, że bezpieczne jest wielokrotne wywoływanie.