2012-04-20 7 views
5

1) Se utilizzo il seguente Class.forName() viene chiamato più volte, causerà perdite di memoria?L'utilizzo di class.forname più volte causerà una perdita di memoria? (running inside tomcat)

Class.forName("MyClass") 

2) In alternativa, è WebAppClassLoader del gatto di andare a verificare se "MyClass" è già caricato e utilizzare l'istanza nella cache invece.

3) Se la risposta alla domanda (2) è "no", la classe caricata in precedenza riceverà la garbage collection, se è stato attivato PermGen sweeping e impostato i parametri jvm rilevanti.

Se si desidera evitare il ricaricamento della classe, qual è il modo migliore di utilizzare la cache dell'istanza di classe. Posso conservare istanza di classe come HashMap

+0

Non penso che dovrebbe perdere memoria finché viene caricato dallo stesso classloader in primo luogo. Anche ClassLoader che cambia nel tempo sembra improbabile. –

risposta

9

1) No, una definizione di classe viene caricata solo una volta da un determinato classloader. Dopodiché, viene tenuto in memoria (nello spazio PermGen) e riutilizzato in successivi riferimenti alla classe, fino all'esistenza del classloader. Questo è indipendente dal modo in cui la classe viene referenziata: via Class.forName, ClassLoader.loadClass o qualsiasi altra cosa.

La stessa definizione di classe può essere caricata in più classloaders più volte (ottenendo in memoria più oggetti token di classe). Questi contano come classi totalmente diverse, che non possono essere espresse tra loro, anche se sono state caricate esattamente dallo stesso file di classe.

2) Sì

3) N/A

4) l'articolo citato afferma che la classe viene ricaricato in un classloader diversa, quindi la mia spiegazione al punto 1) si applica.

+0

Suppongo che stia per utilizzare lo stesso classloader che sarà il classloader di questa applicazione web fornito da tomcat. –

+1

@samarjitsamanta, molto probabilmente sì, anche se non sono un esperto Tomcat quindi non prendermi in parola come garanzia :-) –

+0

sì la risposta della 4a domanda è stata una parte un po 'stupida di me che ha confuso il caricatore di classe e l'istanza di classe:) L'ho capito e ho rimosso la domanda che è irrilevante. grazie per l'answwer veloce. –

0

dalla documentazione:

restituisce l'oggetto classe associato alla classe o interfaccia con il dato nome della stringa.

Non vedo alcuna indicazione che la classe debba essere caricata di nuovo. Ritorna semplicemente indicando che sarebbe sicuro chiamare più volte.