java - son - stack memoria dinamica
Cómo la pila JVM, el montón y los subprocesos se asignan a la memoria física o al sistema operativo (2)
Lo que no entiendo es que, dado que JVM es esencialmente un software, ¿cómo se correlacionan esos mapeos, apilamientos y subprocesos de JVM con la máquina física?
El montón es una región continua preasignada de memoria virtual. p.ej
void* heap = malloc(Xmx); // get the maximum size.
Las pilas son asignadas por la biblioteca de subprocesos cuando se inicia el subproceso. De nuevo, es una región continua de memoria virtual que es el tamaño máximo de pila. De nuevo, podrías pensarlo como
void* stack = malloc(Xss); // get the maximum stack size.
Los hilos nativos son características del sistema operativo que no son parte del espacio JVM como tal.
Porque Java se ejecuta en JVM, pero C ++ no.
C ++ todavía necesita un entorno de tiempo de ejecución y bibliotecas para iniciarse. Intente eliminar su C ++ Runtime o libc y estos no se iniciarán.
Comparando con Java, ¿Cómo se ve el área de datos en tiempo de ejecución de C ++?
Hay una gran región de memoria virtual que puede usar. No hay una imagen porque no te dirá mucho. Imagine un rectángulo largo etiquetado como espacio de usuario.
¿Cómo se correlacionan el mapeo, la pila, los registros y los hilos de JVM con el sistema operativo? o debería preguntar cómo están asignados a la máquina física?
Nuevamente no hay magia. El montón JVM es una región de memoria, una pila JVM es la misma pila nativa que es lo que C + usa, los registros de la JVM son los mismos que los registros nativos que es lo que C + usa y la cadena de JVMs son en realidad hilos nativos que es lo que C + usa .
Creo que estás asumiendo que hay más magia u oscuridad sucediendo de lo que hay. En su lugar, debe suponer que se ha utilizado el diseño más simple, eficiente y ligero y que no estará lejos.
Debería preguntar cómo están mapeados a la máquina física?
uno a uno básicamente.
El libro de compilación (The dragon book) explica que los tipos de valores se crean en la pila, y los tipos de referencia se crean en el montón.
Para Java, JVM también contiene montón y pila en el área de datos de tiempo de ejecución. Los objetos y matrices se crean en el montón, los marcos de método se empujan para apilarse. Un montón es compartido por todos los hilos, mientras que cada hilo tiene su propia pila. El siguiente diagrama muestra esto:
Más sobre las áreas de datos de tiempo de ejecución de Java .
Lo que no entiendo es que, dado que JVM es esencialmente un software, ¿cómo se correlacionan esos mapeos, apilamientos y subprocesos de JVM con la máquina física?
Agradecería que alguien pudiera comparar esos conceptos entre Java y C ++. Porque Java se ejecuta en JVM, pero C ++ no.
Para hacer esta pregunta más precisa, quiero saber lo siguiente:
- Comparando con Java, ¿Cómo se ve el área de datos en tiempo de ejecución de C ++? Una imagen sería útil, no puedo encontrar una buena imagen como la JVM anterior.
- ¿Cómo se correlacionan el mapeo, la pila, los registros y los hilos de JVM con el sistema operativo? o debería preguntar cómo están asignados a la máquina física?
- ¿Es cierto que cada subproceso de JVM es simplemente un subproceso de usuario y se correlaciona con kernal de alguna manera? (subproceso de usuario frente a subproceso kernel)
Actualización : dibujo una imagen para la memoria física en tiempo de ejecución de un proceso.
JVM (Java Virtual Machine) actúa como un motor en tiempo de ejecución para ejecutar aplicaciones Java. JVM es el que realmente llama al método principal presente en un código Java. JVM es una parte de JRE (Java Run Environment).
Las aplicaciones Java se llaman WORA (Write Once Run Anywhere). Esto significa que un programador puede desarrollar código Java en un sistema y puede esperar que se ejecute en cualquier otro sistema habilitado para Java sin ningún ajuste. Todo esto es posible gracias a JVM. Cuando compilamos un archivo .java, el compilador Java genera un archivo .class (contiene byte-code) con el mismo nombre de archivo. Este archivo .class entra en varios pasos cuando lo ejecutamos. Estos pasos juntos describen la JVM completa.