2010-01-26 28 views
14

Si almacenamos objetos en campos estáticos de un objeto, ¿cómo la JVM le asigna la memoria? ¿Vive dentro de un objeto de clase "implícito" (no estoy seguro si estoy usando la palabra correcta)? ¿En qué se diferencian los campos estáticos de los campos de objetos?Java: ¿dónde viven los campos estáticos dentro de la memoria?

+0

Los campos estáticos se inicializan cuando la primera llamada se realiza al tipo adjunto y se puede acceder desde cualquier instancia de ese tipo. –

+0

Recuerde que los objetos a los que se refieren los campos estáticos son solo objetos comunes, por lo que no importa mucho cómo los campos estáticos son manejados por una implementación en particular. –

Respuesta

12

Los campos estáticos son variables de clase y se comparten entre todas las instancias de esa clase. Las variables de instancia (o campos de objeto, como creo que se refiere a ellos como) pertenecen a instancias individuales de una clase y no se comparten.

En cuanto a dónde se almacenan en la memoria se basa en la implementación de la JVM y no hay ninguna razón para que se necesiten dos JVM diferentes para almacenarlas en el mismo lugar por especificación (a mi leal saber y entender) menos - debe insertar el enlace apropiado de la hoja de especificaciones aquí).

0

Como dijo NickLarsen, no creo que haya ninguna especificación de JVM sobre cómo se almacenan exactamente los campos estáticos. Compilar constantes definidas (estática final) reemplazará muy probablemente la expresión durante el tiempo de compilación. Para los campos estáticos variables, solo habrá dos opciones: el montón o (si existe) el segmento de datos de la JVM.

5

Como la respuesta de Nick dice, no hay una ubicación "física" específica estipulada por la especificación del lenguaje, pero en términos de un modelo mental lógico que puede razonar, puede ayudarle a pensar en campos estáticos como adjuntos a el objeto de clase (Foo.class) de la clase a la que pertenecen esos campos.

Como acotación al margen, la clase de objeto se utiliza en otras formas (que son estipulado por la especificación del lenguaje) cuando se trata de entidades estáticas: por ejemplo, cuando se llama a un método estático synchronized, el bloqueo se mantiene en la clase objeto de la clase a la que pertenece el método.

+0

¿Quiere decir que un bloqueo en campos estáticos también bloqueará el objeto de clase? –

+1

@ tm.sauron No puede bloquear un campo, solo el objeto al que se refiere el campo (en ese caso, solo este último está bloqueado). Si llama a un método estático que está 'sincronizado', bloquea el objeto de la clase ya que los métodos estáticos no tienen una referencia' this'. (Los métodos "sincronizados" no estáticos bloquean 'this', no el objeto de clase, al invocar). –

0

Los campos estáticos son parte de la clase; supuestamente, desaparecen cuando la clase está descargada. Tiene sentido imaginarlos como algo cercano a la instancia Class para la clase. Los detalles sobre cómo se presenta la memoria están fuera del alcance de la aplicación Java; como corolario, la especificación JVM no exige nada específico sobre ese tema. Incluso la "desaparición" de los campos cuando la clase está descargada no se puede observar directamente, sino solo a través de la acción GC, asumiendo un método finalize() bien colocado.

0

Los campos estáticos se almacenan dentro del objeto Class, que se mantiene en el espacio PemGen. Esto es parte de la memoria del montón.

Cuestiones relacionadas