Pregunta general: Java tiene el montón y la pila local. ¿Se puede acceder a cualquier objeto del montón?

StackOverflow https://stackoverflow.com/questions/289138

  •  08-07-2019
  •  | 
  •  

Pregunta

Realmente estaba mirando 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 código de bytes de Java durante el tiempo de ejecución, ¿podrías manipular los datos del montón cuando no se supone que debas hacerlo?

¿Fue útil?

Solución

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

La JVM también tiene un verificador. Comprueba el código de cada método (a medida que se carga una clase) para verificar que el método no intente extraer más valores de la pila de ejecución de los que había introducido. Esto garantiza que un método no pueda "ver" los objetos señalados por su método de llamada.

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

Entonces, para recapitular, la respuesta es No.

Otros consejos

Todos los objetos en Java se encuentran en el montón. No estoy muy seguro de lo que quieres decir con "acceder a objetos desde el montón". Las únicas cosas almacenadas en la pila son la lista de funciones que llamaron al 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 manera idéntica, también se podría decir que las referencias de objeto se pasan por valor: si cambia un parámetro para referirse a un nuevo objeto, continuará haciéndose referencia a ese objeto mientras dure la función, pero el objeto original que se pasó aún se referirá a lo que sea que se haya referido antes. Los tipos primitivos también se pasan por valor.

Con respecto a los objetos en la pila, es solo la nueva máquina virtual Java 6 de SUN (y quizás algunas otras) la que intentará optimizar el código de bytes colocando objetos en la pila. Por lo general, todos los objetos irán al montón. Para 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 al no darle las instrucciones necesarias para corromperlo. Las fallas en las implementaciones de JVM pueden hacer que su kilometraje varíe.

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