Comprender cómo Java ejecuta subprocesos múltiples desde el gráfico de memoria
1. Introducción al gráfico de memoria
Como todos sabemos, las variables miembro de la clase Java se guardarán en el área de métodos y el método de tiempo de ejecución de Java se almacenará en la pila. Luego, las variables locales del método también se almacenarán en la pila y el tipo de referencia (objeto nuevo) se almacenará en la memoria del montón. A continuación se utiliza el área de método, la memoria de pila y la memoria de montón en la memoria de Java para demostrar el proceso de ejecución del método de Java.
Primero defina una clase de Persona.
public class Person {
public int age;
public String name;
public void m1() {
}
public void m2() {
m3();
}
public void m3() {
}
public static void m4() {
}
}
En este punto, nuestro mapa de memoria se ve así
Definir otra clase de prueba
public class Test {
public static void main(String[] args) throws Exception{
Person person1 = new Person();
person1.m1();
}
}
En este punto, nuestro mapa de memoria se ve así
2. Modo de ejecución de código de un solo subproceso
Después de iniciar la clase de prueba, cree una pila de subprocesos principal y cree un objeto person1 (almacenado en la memoria del montón y solo contiene miembros no estáticos en la clase)
Luego, el objeto person1 llama al método m1, y la pila de subprocesos principal copia una copia del método m1 de la dirección del objeto person1 en la memoria del montón y la empuja a la pila.
Después de que se ejecuta m1, el método m1 se extrae de la pila, el contenido de todo el subproceso principal finaliza, los métodos se extraen de la pila uno por uno y las referencias de objetos creadas se destruyen.
El objeto person1 en la memoria del montón se reciclará si no se hace referencia a él en otro lugar.
El método principal se ejecuta
3. Modo de ejecución de código de subprocesos múltiples
Ajuste la clase de prueba para permitir que participen varios subprocesos
public class Test {
public static void main(String[] args) throws Exception{
Thread thread1 = new Thread() {
@Override
public void run() {
Person person1 = new Person();
person1.m2();
}
};
Thread thread2 = new Thread() {
@Override
public void run() {
Person person1 = new Person();
person1.m3();
}
};
// -----------------------
thread1.start();
thread2.start();
Person person1 = new Person();
person1.m1();
}
}
El mapa de memoria al ejecutar hasta la línea divisoria es el siguiente
Luego ejecute el método de inicio para lanzar el hilo en la cola lista
Dado que los subprocesos 1 y 2 entran en el estado listo. La CPU puede asignar intervalos de tiempo en cualquier momento para que se ejecute, por lo que no se puede determinar el orden de creación de person1 en thread1 y thread2 y la creación de objetos person1 en el hilo principal. Puede ser que el objeto de person1 en el subproceso principal se haya ejecutado después de que se recicla el método, thread1 y subproceso 2 comienzan a crearse, o pueden existir tres objetos person1 al mismo tiempo.