2008-11-14 17 views
14

Estaba realmente mirando las diferencias entre pasar por valor y cómo Java asigna objetos y qué hace Java para poner objetos en la pila.Pregunta general: Java tiene el montón y la pila local. ¿Puedes acceder a cualquier objeto del montón?

¿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 fue astuto e incluso manipula el bytecode de java durante el tiempo de ejecución, ¿puede manipular datos del montón cuando se supone que no debería hacerlo?

+1

Buena pregunta - Desearía saber más acerca de Java; una buena respuesta a esto será un comienzo para mi iluminación :) –

Respuesta

17

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í.

El 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 había insertado en él. 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.

Así que para recapitular, la respuesta es No.

+0

. Acabo de volver a esto. Así que, básicamente, la estructura de Java y la recolección de basura similar, los lenguajes basados ​​en pila es tal que no puede acceder arbitrariamente a una parte del montón cuando no tiene acceso para hacerlo. –

9

Todos los objetos en Java se encuentran 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 cualquiera la pila o 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.

+0

Hay otras maneras de asignar nuevos objetos (clonar, Class.newInstance(), deserialization), pero todos terminan en el montón. –

+4

El "también se podría decir que las referencias a los objetos se pasan por valor" la explicación es la única correcta.Decir que los objetos se pasan por referencia es inexacto. Básicamente, Java solo tiene un valor por pasaporte, como C. –

4

En cuanto a los objetos en la pila, es sólo la nueva versión 6 de Java VM de SUN (y quizás algunos otros) que tratan de optimizar el código de bytes poniendo 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 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.

+0

No estoy de acuerdo con los comentarios de Java 6. La nueva característica del análisis de escape potencialmente le permite a la JVM evitar la creación de objetos. Entonces los componentes primitivos de lo que habría sido el objeto (int, float, references, etc.) terminan en la pila. Los objetos solo existen en el montón. Período. –

+1

Otra página de IBM, http://www.ibm.com/developerworks/library/j-jtp01274.html, no está de acuerdo con usted John M. Parece que Java puede asignar objetos en la pila. –

+0

@StevenSchlansker enlace hacia abajo .. – Pacerier

Cuestiones relacionadas