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?
Respuesta
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í).
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.
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.
¿Quiere decir que un bloqueo en campos estáticos también bloqueará el objeto de clase? –
@ 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). –
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.
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.
- 1. Java: campos transitorios estáticos
- 2. Android: campos estáticos y fugas de memoria
- 3. Los tipos de referencia viven en el montón, los tipos de valor viven en la pila
- 4. Java: ¿en qué orden se inicializan los campos finales estáticos?
- 5. Descargar campos estáticos
- 6. diferencias de rendimiento entre los campos primitivos finales estáticos y no estáticos en Java
- 7. ¿Los miembros estáticos ayudan a la eficiencia de la memoria?
- 8. ¿Cuándo comienzan a existir los campos estáticos?
- 9. cómo forzar la creación de instancias de los campos estáticos
- 10. Acceder a dejar los campos vinculados de los miembros estáticos
- 11. luabind y campos estáticos
- 12. recuperar sólo los campos estáticos declarados en la clase de Java
- 13. ¿Cómo puedo saber dónde viven los scripts de inicio de sesión?
- 14. ¿Dónde se almacenan los métodos en la memoria?
- 15. Interfaces con campos estáticos en Java para compartir 'constantes'
- 16. Existen especialidades dentro de los campos integrados
- 17. ¿Cuál es el significado exacto de los campos estáticos en Java?
- 18. Mejora de las clases de Java utilizando rasgos, ¿cómo declarar dentro de los campos Java?
- 19. ¿Dónde se almacenan los bloques CMS estáticos de Magento?
- 20. declaración final de carrera con campos estáticos
- 21. Java StringTokenizer.nextToken() salta sobre los campos vacíos
- 22. En Java, ¿los tipos enum dentro de una clase son estáticos?
- 23. En Java, ¿las variables declaradas dentro de los métodos estáticos son estáticas?
- 24. ¿Cómo maneja la memoria gestionada .net los tipos de valores dentro de los objetos?
- 25. Java: hacer una referencia estática a la lista de campos no estáticos
- 26. Inicializadores estáticos y métodos estáticos En Java
- 27. ¿Se puede usar @Autowired con campos estáticos?
- 28. ¿Dónde busca java los archivos?
- 29. En Java, ¿los miembros de la clase estáticos están compartidos entre los programas?
- 30. ¿Los campos de datos SQLite nulos ocupan más memoria?
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. –
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. –