Supongamos que tiene un archivo jar de 3 Gb y su aplicación solo usa una clase pequeña dentro de él. ¿La JVM carga todo el archivo jar en la memoria o lee el índice y carga solo las piezas que necesita? ¿Este comportamiento es controlable?¿Java JVM carga un frasco o oreja completo si solo usa una clase de él?
Respuesta
JVM solo carga las clases requeridas desde el Jar cuando se invoca. Si la aplicación necesita una clase, entonces la clase y todas las otras clases dependientes se cargarán. No estoy seguro, pero supongo que es responsabilidad del cargador de clases ubicar la clase desde el classpath y cargar.
El cargador de clases predeterminado solo carga lo que necesita, cuando lo necesita. Si tiene un JAR de 10 MB en su CLASSPATH, y solo se necesita un archivo .class, la JVM solo cargará esa clase la primera vez que el código intente acceder a ella. El bytecode .class entra en el espacio permanente.
Es "controlable" en el sentido de que puede escribir su propio cargador de clases, pero requiere cierta experiencia para hacerlo.
Todo depende de JVM y del cargador de clases. La especificación JVM especifica que la clase debe aparecer para ser cargada en su primer uso activo. Los cargadores de clases pueden cargar algunas de las clases antes de lo requerido en anticipación. En realidad, la mayoría de los cargadores de clase demoran la carga el mayor tiempo posible.
Los archivos jar son una forma de archivos comprimidos.
La forma en que se manejan depende en gran medida de JRE.
Las versiones anteriores de Sun JRE utilizadas para la memoria mapean todo el archivo. Esto asignará la memoria lógica, pero no necesariamente causará que se carguen los datos del disco. (Windows de 32 bits generalmente no es capaz de asignar 3 GB de memoria contigua, aunque puede hacerlo en otros sistemas operativos).
Creo que el comportamiento actual es la asignación de memoria al directorio central en la parte posterior del archivo en Windows. En otros sistemas operativos, solo se lee. Esto está controlado por #define
s en la fuente.
Es probable que JDK7 haga algo más.
Las clases se cargan generalmente perezosamente. Los recursos se vuelven a leer cada vez. java.util.ResourceBundle
cachés.
- 1. ¿Es posible iniciar sesión si se usa una clase en la JVM?
- 2. Bloqueo de JVM mientras memcpy durante la carga de clase
- 3. ¿En qué orden se inicializan las diferentes partes de una clase cuando se carga una clase en la JVM?
- 4. Frasco o Django para un principiante?
- 5. Implementación de Java de ... ¿JVM?
- 6. Pasar un archivo completo a argumentos de JVM
- 7. Buildr: dependencias de los paquetes en un solo frasco
- 8. Si estoy actualizando un DataRow, ¿bloqueo el DataTable completo o solo el DataRow?
- 9. SSL en todo el sitio o solo parte de él?
- 10. ¿Quién realmente usa un JID completo?
- 11. ¿Cuántas solicitudes concurrentes recibe un solo proceso de Frasco?
- 12. crear oreja en grial
- 13. Comprueba si un objeto pertenece a una clase en Java
- 14. ¿Por qué utilizar una oreja en lugar de una guerra?
- 15. ¿Cuándo JVM de Java descomprime archivos jar?
- 16. ¿Qué significa "Cuando se carga una clase" en realidad?
- 17. Cómo comprobar si un archivo está "completo" (escrito por completo) con Java
- 18. manifiesta de un frasco
- 19. En Java, ¿alguien usa short o byte?
- 20. es el comando "java" de la JVM?
- 21. ¿Cómo deshabilitar los registradores de una clase o de un paquete completo?
- 22. ¿Sabes si un sistema embebido usa glibc o biónico?
- 23. ¿Hay una JVM por aplicación Java?
- 24. cargar un recurso contenida en un frasco
- 25. ¿Un ResultSet carga todos los datos en la memoria o solo cuando se solicita?
- 26. ¿Para qué usa la gente la carga de clases?
- 27. ¿Compiladores Java o lenguajes JVM que soportan goto?
- 28. ¿Cómo saber si un dll usa ASLR o no?
- 29. Comprueba si una clase es una subclase de otra clase en Java
- 30. ¿La carga de clase de Java es extremadamente lenta?