Pregunta

Sé que las variables locales y los parámetros de los métodos viven en la pila, pero no puedo averiguar dónde viven los métodos en el caso de Java.

Si declaro cualquier objeto Thread como:

Thread t=new Thread();
t.start();

Eso significa que he creado una llamada separada de métodos aparte del método principal. Qué significa eso? ¿Significa llamar a una secuencia separada de métodos sobre la memoria de pila? Estoy en lo correcto?

¿Fue útil?

Solución

A cada hilo se le asigna su propia pila.

Este artículo tiene una buena introducción a la separación de memoria dentro de un proceso Java.

  

Dentro de la máquina virtual de Java, cada uno   hilo se otorga una pila de Java, que   contiene datos que ningún otro hilo puede   Acceso, incluyendo las variables locales,   parámetros, y los valores de retorno de cada   Método que el hilo ha invocado. los   los datos en la pila se limitan a   Tipos primitivos y referencias de objetos.   En la JVM, no es posible   Coloque la imagen de un objeto real en   la pila. Todos los objetos residen en el   montón.

He visto muchos escenarios en los que los clientes han implementado servidores con muchos subprocesos sobre la base de que cada subproceso hace muy poco y tienen problemas con la memoria. Eso es porque a cada hilo se le asigna su propia pila, y esto (obviamente) se suma. Creo que el valor predeterminado es 512k por subproceso, pero no he encontrado una fuente canónica para eso.

Otros consejos

Si recuerdo correctamente, el código del método vivirá en la parte del código de la memoria, mientras que las variables declaradas internamente vivirán en la pila, y los objetos se crearán en el montón. En Java, los punteros y primitivos variables viven en la pila, mientras que cualquier objeto creado vive en el montón.

Para una representación ASCII (deficiente):

-------
|STACK|
-------
|FREE |
-------
|HEAP |
-------
|CODE |
-------

Donde el STACK representa la pila, FREE representa la memoria libre, HEAP representa el montón y CODE representa el espacio del código.

Esto es lo que dice mi memoria: algunos de los detalles podrían estar equivocados.

La pila se compone de invocaciones de métodos. Lo que java inserta en la pila es un registro de invocación de método, que encapsula todas las variables (parámetros y variables creadas de manera local) para ese método. Cuando inicias una aplicación Java, el método principal (que incluye automáticamente el parámetro args) es lo único en la pila:

main(args)

Cuando digas que creas un objeto Foo y llamas a foo.method (), la pila ahora parece:

method()
main(args)

A medida que se llaman los métodos, estos se insertan en la pila y, a medida que se devuelven, se eliminan o se "quitan" de la pila. A medida que las variables se declaran y usan, la entrada de pila, que corresponde al método actual (en la parte superior de la pila), crece para incluir el tamaño de la variable.

Para su ejemplo con hilos, cada hilo tendrá su propia pila que existe independientemente de la pila de cada uno de los otros hilos.

La pila contiene todas las variables locales y todas las invocaciones de métodos activos. El montón contiene todo lo demás.

En cuanto a su pregunta secundaria: significa que se crea una nueva pila con su propia memoria dedicada. Mientras que su nuevo hilo compartirá el espacio total de almacenamiento dinámico (memoria) asignado por el jvm

El montón se divide en varias generaciones.

El bytecode y su código de máquina compilado JIT corrosivo viven en la llamada generación permanente, junto con las cadenas internas y otros datos de clase.

Aunque se denomina " permanente " generación, todavía puede ser recogida de basura. Algunas bibliotecas, marcos y lenguajes JVM generan códigos de bytes en tiempo de ejecución, por lo que la generación permanente a veces necesita ser limpiada. Al igual que las otras generaciones del montón, pero (uno suele esperar) con menos frecuencia.

El código de bytecode y / o JIT real viviría en la memoria del proceso. Es probable que solo haya una copia del mismo en la memoria del proceso, ya que todos los subprocesos de un proceso determinado comparten esa memoria. Se accederá a las variables compartidas por esos subprocesos mediante los métodos comunes. Las variables locales a los subprocesos (incluso las variables locales del método utilizadas dentro de un subproceso) se crearán dentro de la memoria de ese subproceso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top