Soy relativamente nuevo en Java, así que perdóname si esta pregunta puede parecer "tonta". Sé que la JVM (Java Virtual Machine) está contenida en el JRE (Java Runtime Environment) , pero no estoy seguro de si el cargador de clases y el motor de ejecución forman parte de la JVM.
La mayoría de las fuentes que he leído no especifican esto. En cambio, cuando describen los componentes de JVM, solo analizan los 5 componentes del área de datos de tiempo de ejecución (es decir, montón, pila de JVM, área de método, registros de PC y pila de método nativo) . Aunque mi sentido común dice que para que sea una máquina virtual completa, necesita la entrada, la memoria y el procesamiento, todavía necesito verificar las ubicaciones exactas de estos componentes.
Según la wikipedia de Classloader , hay 3 tipos de cargadores de clases en JRE:
Este cargador de clases, que forma parte de la JVM principal, está escrito en código nativo.
Es implementado por la clase sun.misc.Launcher$ExtClassLoader
Esto lo implementa la clase sun.misc.Launcher$AppClassLoader
Entonces, en conclusión, creo que el primero está en JVM, los otros 2 están en las bibliotecas JRE.
No creo que sea posible hacer una distinción clara.
JRE es el nombre de un tipo de distribución de Java, que (por cierto) Oracle ya no proporciona.
JVM (máquina virtual Java) es un término más abstracto. Se refiere a "una cosa que ejecuta programas Java". En términos prácticos, consta de un núcleo escrito en código nativo y una gran cantidad de código Java. Pero no hay una línea clara trazada entre la máquina virtual y las bibliotecas que admiten la máquina virtual y otras que son "parte de Java" que ejecuta la máquina virtual.
La clase java.lang.Classloader es un buen ejemplo de esto. Parte de ella está escrita en Java. Otras partes son métodos de código nativo proporcionados por el núcleo de código nativo de JVM. Todas las demás clases de cargadores de clases extend ClassLoader . Algunos son parte de la biblioteca estándar y otros pueden provenir de bibliotecas o marcos de terceros, o pueden ser implementados por la propia aplicación.
Luego está el cargador de clases de arranque que está completamente escrito en código nativo y comparte el código con los métodos de código nativo de ClassLoader .
En resumen, no creo que sea posible obtener una respuesta clara. Y no creo que intentar o tener éxito en trazar una línea dura alrededor de la JVM realmente logre algo.