2008-11-18 14 views
5

Cuando llamo a un método estático como:Java: `Métodos static`

Something.action(); 

Dado que una instancia no se crea cuánto tiempo va a la clase del método estático se mantiene en la memoria?

Si llamo al mismo método, ¿se volverá a cargar la Clase para cada llamada ya que no existe ninguna instancia?

Y solo se cargan métodos estáticos individuales cuando se llaman o todos los métodos y métodos estáticos de una clase se cargan en la memoria aunque solo se use un método estático?

Respuesta

11

A menos que haya configurado la recolección de elementos no utilizados de permgenspace, la clase permanece en la memoria hasta que sale la vm. La clase completa está cargada con todos los métodos estáticos.

+0

Esto no es estrictamente cierto, aunque es un modelo mental razonable de carga de clases. Algunas VM descargarán dinámicamente las clases no utilizadas para reducir el tamaño de la memoria residente; sin embargo, dicha optimización solo entrará en juego con los procesos de ejecución muy larga y solo en las máquinas virtuales que la implementen. –

4

La clase permanece en la memoria hasta que el cargador de clases que cargó esa clase permanezca en la memoria. Entonces, si la clase se carga desde el cargador de clases del sistema, la clase nunca se descarga, hasta donde yo sé.

Si desea descargar una clase, es necesario:

  1. carga la clase y todas las clases que se refiere a la clase utilizando un cargador de clases personalizada
  2. Después de que haya terminado con esa clase, la liberación todas las referencias a la clase - es decir, asegúrese de que no haya instancias de objetos de esa clase alrededor de
  3. Descargue la clase y todas las clases que se refieren a ella liberando la instancia del cargador de clases personalizado que cargó esas clases.
1

La clase Algo debe conseguir carga cuando se carga la clase de persona que llama. Y se queda allí hasta la salida de la VM como dijo krosenvold.

2

En algunas configuraciones, la clase incluso se carga antes de realizar la llamada. Utilizamos BES (Borland Enterprise Server) y tuvimos un problema con nuestros servidores de producción de Solaris donde todas las clases referenciadas se cargaron recursivamente al inicio de nuestra aplicación. Eso significa que, cuando se cargó la clase principal de nuestra aplicación, el servidor de aplicaciones cargó todas las clases a las que se hace referencia en la sección de importación de esa clase ... recursivamente.

Como nota al margen, a menos que esté ejecutando en un entorno de restricción de memoria, o si está cargando muchas clases innecesarias, no debería preocuparse demasiado por el uso de memoria de las clases cargadas en la memoria.

+0

¿Cuáles fueron algunos de los problemas que tuvo con las clases a las que se hace referencia que se cargan "prematuramente"? Tengo curiosidad de qué tipo de problema sería el caso. –

+0

El problema era que teníamos las mismas bibliotecas ejecutándose en el servidor y en el cliente. Parte de la ruta del código no se tomaría en el servidor, por lo que tratamos de eliminar las bibliotecas innecesarias a las que no se llamaría. Incluso si no se llama el código, la aplicación se bloqueará al inicio. – Guillaume