Quiero saber la ubicación que JVM asigna a los objetos que se colocan en la memoria del sistema.¿Cómo puedo obtener la ubicación de memoria de un objeto en Java?
Respuesta
Esto es algo que probablemente no desee hacer.
Si realmente quiere hacer esto, algo así como el código podría ayudar:
package test;
import java.lang.reflect.Field;
import sun.misc.Unsafe;
public class Addresser
{
private static Unsafe unsafe;
static
{
try
{
Field field = Unsafe.class.getDeclaredField("theUnsafe");
field.setAccessible(true);
unsafe = (Unsafe)field.get(null);
}
catch (Exception e)
{
e.printStackTrace();
}
}
public static long addressOf(Object o)
throws Exception
{
Object[] array = new Object[] {o};
long baseOffset = unsafe.arrayBaseOffset(Object[].class);
int addressSize = unsafe.addressSize();
long objectAddress;
switch (addressSize)
{
case 4:
objectAddress = unsafe.getInt(array, baseOffset);
break;
case 8:
objectAddress = unsafe.getLong(array, baseOffset);
break;
default:
throw new Error("unsupported address size: " + addressSize);
}
return(objectAddress);
}
public static void main(String... args)
throws Exception
{
Object mine = "Hi there".toCharArray();
long address = addressOf(mine);
System.out.println("Addess: " + address);
//Verify address works - should see the characters in the array in the output
printBytes(address, 27);
}
public static void printBytes(long objectAddress, int num)
{
for (long i = 0; i < num; i++)
{
int cur = unsafe.getByte(objectAddress + i);
System.out.print((char)cur);
}
System.out.println();
}
}
Pero
-
no
- portable a través de JVM o incluso diferentes versiones
- objetos pueden moverse debido de GC en cualquier momento, y no se puede sincronizar a través de los GC, por lo que los resultados pueden no tener sentido
- no probado CA Ross todas las arquitecturas, endianess, etc. podría hacer esto no funciona en todas partes
Parece que 'unsafe.addressSize()' en Sun JDKs de 64 bits devuelve 8 incluso cuando UseCompressedOpps está activado. Usando 'unsafe.arrayIndexScale (Object []. Class)', que devuelve 4 en ese caso, parece ser más probable que funcione con esta técnica (después de todo, está almacenando el objeto en una matriz de objetos). Con ¡uy comprimido, la dirección devuelta no es una dirección verdadera, se puede desplazar a la derecha por 3 bits, etc. – BeeOnRope
Sin utilizar funciones específicas de JVM, esto no se puede hacer. Java oculta deliberadamente la ubicación asociada a cada objeto para darle más flexibilidad a la implementación (la JVM a menudo mueve los objetos en la memoria cuando realiza la recolección de elementos no utilizados) y para mejorar la seguridad (no puede usar punteros sin procesar para destruir la memoria o acceder a objetos inexistentes).
¿Y qué hay de la implementación predeterminada de 'Object.hashCode()'? Devuelve la dirección de memoria del objeto, ¿no es así? ¿Utiliza la clase Inseguro de la que @prunge habló? Sé que es un método nativo, así que tal vez esto es simplemente un lanzamiento de puntero a int en C++. –
'Object.hashCode()' does * not * devuelve la dirección de memoria del objeto. Es específico de la implementación. Pasé varios meses trabajando en una implementación de JavaScript de una JVM donde no se puede trabajar con direcciones sin formato y se implementó 'Object.hashCode()' con solo tener un contador que incrementé para cada objeto. En algunas implementaciones, puede ser así como funciona 'Object.hashCode()', pero debido a que muchas JVM mueven objetos en la memoria, no puede confiar en que esto sea cierto. – templatetypedef
'System.identityHashcode (Object)' es significativamente más complicado que devolver la dirección de memoria de un objeto ... incluso si eso es lo que parece * hacer *. Para empezar, tiene que devolver el mismo valor incluso si el GC ha movido el objeto. Esto generalmente implica * guardar * el valor en el objeto. (Algunas JVM hacen esto de una manera inteligente que minimiza la sobrecarga ... pero al final pagas). –
Quiero saber la ubicación que JVM asigna a los objetos
No se puede, ya que no existe . Cambia con el tiempo debido a la acción del recolector de basura. No existe tal como 'la ubicación'.
Los saldos de mi tarjeta de crédito cambian, lamentablemente todavía existen. – weston
@weston El saldo de su tarjeta de crédito cambia, por lo tanto, no puede confiar en que siempre será el mismo. – EJP
No dijeron que necesitaban confiar en que no cambiara. Mi punto (broma) fue que eso no significa que no exista. Pero, de todos modos, hay formas de anclarlo: secciones críticas de JNI, por ejemplo, donde la ubicación es exacta y se garantiza que no cambiará. – weston
Puede usar http://openjdk.java.net/projects/code-tools/jol para analizar diseños de objetos. Para un objeto, puede usar:
System.out.println(
GraphLayout.parseInstance(someObject).toPrintable());
a) Las respuestas solo de enlace no se consideran buenas respuestas aquí, ver [respuesta]. b) Esta pregunta ya tiene muchas otras respuestas de alta calidad; ¿Qué significa esto? – EJoshuaS
Gracias por los comentarios. Se agrega una referencia a la herramienta moderna estándar - JOL, que no están aquí. Es una forma más limpia y portátil, que para la tarea del autor toma una fila de código, en lugar de un ejemplo inseguro. También agregué ejemplos de código para la pregunta. – egorlitvinenko
- 1. ¿Cómo puedo obtener el nombre de un Objeto en Java?
- 2. ¿Cómo puedo obtener la "ubicación de memoria" de una instancia en ActionScript? depurador
- 3. ¿Cómo puedo convertir una cadena en un objeto de ubicación?
- 4. ¿Cómo puedo obtener un objeto HDC de un objeto CDC?
- 5. ¿Cómo obtener la ubicación de un objeto relativo a la Ventana en iOS?
- 6. La mejor forma de obtener una ubicación geográfica en Java
- 7. ¿Cómo puedo obtener la ubicación actual de GPS?
- 8. ¿Cómo puedo obtener la ubicación actual en Android programáticamente?
- 9. ¿Cómo obtener la dirección de memoria del montón de Java?
- 10. Desreferencia ubicación de memoria arbitraria en C
- 11. ¿Cómo puedo obtener el tamaño de un objeto en HttpRuntime.Cache?
- 12. ¿Cómo obtener la ubicación (src) de un archivo javascript?
- 13. ¿Cómo puedo usar un objeto Singleton de Scala en Java?
- 14. C# ¿Cómo puedo fijar un objeto en la memoria sin ordenar el objeto?
- 15. ¿Cómo puedo iniciar un applet de Java con más memoria?
- 16. ¿Cómo se ve un objeto en la memoria?
- 17. ¿Cómo puedo obtener la versión y la ubicación de un módulo Perl instalado?
- 18. Android: cómo obtener la ubicación de un amigo
- 19. ¿Puedo obtener la ubicación del enlace a través de selenio?
- 20. ¿Cómo puedo obtener la memoria pico en Mac OS?
- 21. C# cambiar la ubicación de un objeto mediante programación
- 22. Cómo puedo obtener un marcador en la ubicación actual en el mapa en Sencha-Touch2.0
- 23. ¿Cómo puedo obtener la memoria física total en C#?
- 24. ¿Cómo puedo modificar un archivo zip solo en la memoria?
- 25. Cómo puedo obtener datos brutos de un objeto CVImageBuffer
- 26. cómo obtener un proceso de memoria hijo en node.js?
- 27. al obtener la ubicación de coordenadas
- 28. Acceso a la memoria no válida de la ubicación en Java
- 29. Cómo puedo obtener un flujo de entrada del objeto HSSFWorkbook
- 30. ¿Cómo puedo obtener claves de objeto por un patrón?
Bien, le preguntaré: ¿por qué? –
Posible duplicado de [Dirección de memoria de variables en Java] (http://stackoverflow.com/questions/1961146/memory-address-of-variables-in-java) –