Quiero saber la ubicación que JVM asigna a los objetos que se colocan en la memoria del sistema.

  • Ok, voy a preguntar: ¿por qué?
  • Posibles duplicados de dirección de Memoria de variables en Java
  • No. Que uno se pregunta si algo es una dirección de memoria. Este es preguntando cómo obtener la dirección de memoria.

4 Comentarios

  1. 32

    Esto es algo que usted probablemente no quiere hacer.

    Si realmente quiero hacer de esto, algo como este 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 es portable a través de Jvm o incluso versiones diferentes
    • los objetos se pueden mover porque de GC en cualquier momento, y no se puede sincronizar a través de GCs así que los resultados podrían no tener sentido
    • no probada en todas las arquitecturas, «endian», etc. podría hacer esto no funciona en todas partes
    • Parece que unsafe.addressSize() de 64 bits Sol JDKs devuelve 8 incluso cuando UseCompressedOpps es en. El uso de unsafe.arrayIndexScale(Object[].class), que devuelve 4 en ese caso, parece ser más propensos a trabajar con esta técnica (después de todo, usted está almacenando el objeto en un Objeto de matriz). Comprimido uy, la dirección devuelta no es una verdadera dirección – puede ser desplazado a la derecha por 3 bits, etc.
  2. 11

    Sin el uso de la JVM características específicas de esto no se puede hacer. Java se oculta la ubicación asociada con cada objeto para dar la implementación más flexibilidad (la JVM a menudo se mueve objetos a su alrededor en la memoria cuando se hace la recolección de basura) y para mejorar la seguridad (no se puede utilizar cruda punteros a memoria de basura o inexistente acceso a objetos).

    • Y qué acerca de la implementación predeterminada de Object.hashCode()? Devuelve la dirección de memoria del objeto, ¿no? Hace uso de la clase Inseguro que @prunge dijo acerca de? Sé que es un método nativo, así que tal vez esto es simplemente un puntero-a-int emitidos en C++?
    • Object.hashCode() no no regreso a la dirección de memoria del objeto. Es específico de la implementación. Pasé varios meses trabajando en un JavaScript de la aplicación de una JVM donde no se puede trabajar con raw direcciones de e implementado Object.hashCode() con sólo tener un contador de I se incrementa en cada objeto. En algunas implementaciones esta puede ser la manera en Object.hashCode() funciona, pero debido a que muchos Jvm mover objetos en la memoria no se puede confiar en esto de ser cierto.
    • System.identityHashcode(Object) es mucho 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 se ha movido el objeto. Normalmente, esto implica que guardar el valor en el objeto. (Algunos de JVM a hacer esto de una manera inteligente que minimiza la sobrecarga … pero usted tiene que pagar al final.)
  3. -2

    Puede utilizar http://openjdk.java.net/projects/code-tools/jol para analizar el objeto de diseños y obtener ubicaciones en la memoria. Para que un objeto se puede utilizar:

    System.out.println(
    GraphLayout.parseInstance(someObject).toPrintable());
    System.out.println("Current address: " + VM.current().addressOf(someObject));
    • a) Enlace-sólo respuestas no son consideradas buenas respuestas aquí, por favor, consulte Cómo Responder. b) Esta pregunta ya tiene varios otros de alta calidad de respuestas; lo que hace este complemento?
    • Gracias por los comentarios. Se añade la referencia a la norma herramienta moderna – JOL, que no están aquí. Es más limpio y portátil, que para el autor la tarea de tomar una fila de código, en lugar de Inseguro ejemplo. También he añadido los ejemplos de código para la pregunta.
  4. -4

    Quiero saber la ubicación que JVM asigna a los objetos

    No se puede, porque no existe. Cambia a través del tiempo debido a recolector de basura de la acción. No hay tal cosa como la ‘el ubicación».

    • Mi tarjeta de crédito los saldos de cambio, por desgracia, todavía existen.
    • Su tarjeta de crédito, los cambios en el equilibrio, por lo tanto, usted no puede confiar en que siempre es el mismo.
    • Ellos no dicen que se necesitan para confiar en él no cambia. Mi punto (broma) fue que no significa que no exista. Pero de todos modos hay formas para pin: JNI de las secciones críticas, por ejemplo, donde la ubicación es exacta y garantizado para ser inmutable.
    • La pregunta dice, y cito, ‘quiero saber la ubicación que JVM asigna a los objetos que se colocan en la memoria del sistema.’ Como no hay tal lugar único, mi respuesta tiene.
    • No hay ninguna mención de la dirección de ser único en todos los en la pregunta. Y definitivamente hay una específica dirección de memoria que se asigna a cada objeto que JVM crea, incluso si los cambios en el curso del tiempo , por lo que su afirmación es incorrecta.

Dejar respuesta

Please enter your comment!
Please enter your name here