para - que es settitle en java
Java: ¿dónde viven los campos estáticos dentro de la memoria? (5)
Si almacenamos objetos en campos estáticos de un objeto, ¿cómo asigna la JVM la memoria para ello? ¿Vive dentro del 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 objeto?
Como dijo NickLarsen, no creo que haya ninguna especificación de JVM sobre cómo se almacenan exactamente los campos estáticos. Compilar las constantes definidas (final estático) reemplazará muy probablemente la expresión durante el tiempo de compilación. Para campos estáticos variables solo habrá dos opciones: el montón o (si existe) el segmento de datos de la JVM.
Los campos estáticos se almacenan dentro del objeto Clase, que se mantiene en el espacio de PemGen. Esto es parte de la memoria del montón.
Los campos estáticos son parte de la clase; Supuestamente, desaparecen cuando se descarga la clase. Tiene sentido imaginarlos como si estuvieran cerca de la instancia de Class
para la clase. Los detalles sobre cómo se distribuye la memoria están fuera del alcance de la aplicación Java; como corolario, la especificación de JVM no exige nada específico sobre ese tema. Incluso la "desaparición" de los campos cuando se descarga la clase no se puede observar directamente, sino solo a través de la acción de GC, asumiendo un método finalize()
bien colocado.
Los campos estáticos son variables de clase y se comparten entre todas las instancias de esa clase. Las variables de instancia (o los campos de objeto como creo que se refiere a ellos) pertenecen a instancias individuales de una clase y no se comparten.
En cuanto a dónde se almacenarán en la memoria, se basará en la implementación de la JVM y no hay ninguna razón por la que se necesitarían dos JVM diferentes para almacenarlas en el mismo lugar por especificación (al menos que yo sepa, al menos debería hoja de especificaciones apropiada enlace aquí).
Como dice la respuesta de Nick, 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 sobre el que puede razonar, puede ayudarlo a pensar que los campos estáticos están vinculados al objeto de la clase ( Foo.class
) de la clase a la que pertenecen esos campos.
Además, el objeto de clase se usa de otras maneras (que están estipuladas por la especificación de 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 el objeto de clase de la clase que método pertenece a.