tutorial pilas pila objetos interfaz grafica con colas codigo java jvm stack heap

java - objetos - pilas y colas en jframe



Pregunta general: Java tiene el montón y la pila local. ¿Puedes acceder a cualquier objeto del montón? (3)

En cuanto a los objetos en la pila, es solo la nueva VM Java 6 de SUN (y tal vez algunos otros) que tratará de optimizar el código de bytes colocando objetos en la pila. Por lo general, todos los objetos entrarán en el montón. Como referencia, consulte: http://www.ibm.com/developerworks/java/library/j-jtp09275.html

También la especificación de JVM está en http://java.sun.com/docs/books/jvms/second_edition/html/Overview.doc.html#6348 . La JVM protege su montón simplemente sin darle las instrucciones necesarias para corromperlo. Los defectos en las implementaciones de JVM pueden hacer que su millaje varíe.

Realmente estaba viendo las diferencias entre pasar por valor y cómo Java asigna objetos y qué hace Java para poner objetos en la pila.

¿Hay alguna forma de acceder a los objetos asignados en el montón? ¿Qué mecanismos aplica java para garantizar que el método correcto pueda acceder a los datos correctos del montón?

Parece que si fuiste astuto e incluso manipulaste el bytecode de java durante el tiempo de ejecución, ¿es posible que puedas manipular los datos del montón cuando no se supone que debes hacerlo?


No hay instrucciones en el conjunto de instrucciones de JVM que otorgue acceso arbitrario al montón. Por lo tanto, la manipulación de bytecode no te ayudará aquí.

La JVM también tiene un verificador. Comprueba el código de cada método (a medida que se está cargando una clase) para verificar que el método no intente extraer más valores de la pila de ejecución que lo que le había impuesto. Esto asegura que un método no puede "ver" los objetos apuntados por su método de llamada.

Finalmente, las variables locales se almacenan en una matriz por método (conocida como "matriz de variables locales"). Una vez más, el verificador se asegura de que cada instrucción de lectura / escritura desde / hacia esa matriz especifique un índice que sea menor que el tamaño de la matriz. Tenga en cuenta que estas instrucciones JVM solo pueden especificar un índice constante. No pueden tomar un valor calculado y usarlo como índice.

Entonces, para recapitular, la respuesta es No.


Todos los objetos en Java están ubicados en el montón. No estoy muy seguro de lo que quiere decir con "acceder a los objetos desde el montón". Las únicas cosas almacenadas en la pila son la lista de funciones que se llama en el contexto actual y sus variables y parámetros locales. Todas las variables y parámetros locales son tipos primitivos o referencias.

Si asigna un objeto usando new (que es la única forma de asignar tipos no primitivos, sí esto incluye tipos de matriz), entonces el objeto se asigna en el montón, y una referencia a ese objeto se almacena en la pila o en el montón, dependiendo de si la referencia se almacena en una variable / parámetro local o como miembro de otro objeto.

Cuando se pasan como parámetros a las funciones, todos los objetos se pasan por referencia; si la función modifica el parámetro, el objeto original también se modifica. De forma idéntica, también podría decirse que las referencias a objetos se pasan por valor: si cambia un parámetro para referirse a un nuevo objeto, continuará refiriéndose a ese objeto durante la duración de la función, pero el objeto original que se pasó en seguirá refiriéndose a lo que se refirió antes. Los tipos primitivos también se pasan por valor.