2012-04-20 18 views
5

1) Si uso el siguiente Class.forName() se llama varias veces, ¿provocará pérdidas de memoria?¿Usará class.forname varias veces para causar pérdida de memoria? (ejecutándose dentro de tomcat)

Class.forName("MyClass") 

2) O, es WebAppClassLoader de Tomcat va a comprobar si "MyClass" ya está cargado y utilizar la instancia en caché en lugar.

3) Si la respuesta a la pregunta (2) es 'no', la clase previamente cargada obtendrá basura recolectada, si activé PermGen y configuré los parámetros jvm relevantes.

Si quiero evitar la recarga de la clase, ¿cuál es la mejor manera de usar la memoria caché de la instancia de la clase. ¿Puedo almacenar instancia de clase como HashMap

+0

No creo que deba perder memoria siempre que se cargue desde el mismo cargador de clases en primer lugar. También es poco probable que cambie ClassLoader a lo largo del tiempo. –

Respuesta

9

1) No, una definición de clase solo se carga una vez por cualquier cargador de clases determinado. Después de eso, se guarda en la memoria (en el espacio PermGen) y se reutiliza en referencias posteriores a la clase, hasta que exista el cargador de clases. Esto es independiente de cómo se hace referencia a la clase: a través de Class.forName, ClassLoader.loadClass o lo que sea.

La misma definición de clase se puede cargar varias veces en diferentes cargadores de clases (lo que da como resultado varios objetos de token de clase en la memoria). Estos cuentan como clases totalmente diferentes, que no se pueden transmitir entre sí, incluso si se cargaron desde exactamente el mismo archivo de clase.

2) Sí

3) N/A

4) el artículo de referencia menciona que la clase se vuelve a cargar en un cargador de clases diferentes, por lo que mi explicación bajo 1) se aplica.

+0

Supongo que esto va a utilizar el mismo cargador de clases que será el cargador de clases de esta aplicación web proporcionado por tomcat. –

+1

@samarjitsamanta, probablemente sí, aunque no soy un experto en Tomcat, así que no tome mi palabra como garantía :-) –

+0

sí, la respuesta de la 4ta pregunta fue una parte un poco estúpida de mí que mezcló el cargador de clases y la instancia de clase:) Me di cuenta y eliminé la pregunta que es irrelevante. gracias por la respuesta rápida. –

0

de la documentación:

devuelve el objeto de la clase asociada con la clase o interfaz con el nombre de la cadena dada.

No veo indicación de que la clase deba cargarse nuevamente. Simplemente lo devuelve indicando que sería seguro llamar varias veces.

Cuestiones relacionadas