2011-01-10 15 views
5

Digamos que tengo esta variable:¿es posible obtener la dirección en el montón de una variable en Java?

... 
Somekindofobject var = new Somekindofobject(); 
... 

y quiero saber dónde se encuentra var en el montón (por dirección, como 0x08 y así sucesivamente), y para imprimir la dirección hacia fuera.

¿es posible?

+0

Si todo lo que quiere hacer es imprimir el objeto, ¿qué beneficio obtiene de saber dónde está en el montón? ¿Qué estás realmente tratando de lograr? – Anon

+0

@Anon: creo que quiere decir imprimir la dirección. –

+0

estoy trabajando en un programa que obtiene como entrada el programa Java, y el código de instrumentos que imprime en la información del archivo sobre acceso variable. La única manera que puedo determinar entre dos campos de objetos de la misma clase es por su dirección en el montón. Por lo tanto, necesito la dirección en el montón – RanZilber

Respuesta

8

estoy trabajando en un programa que se pone como programa Java de entrada, y los instrumentos código que imprime a presentar información sobre el acceso variable. La única forma en que puedo determinar entre dos campos de objetos de la misma clase es por su dirección en el montón. Por lo tanto, necesito la dirección en el montón

Puede utilizar System.identityHashCode para obtener una noción de igualdad. No es perfecto, pero es bastante bueno. Si obtiene la dirección de almacenamiento dinámico de un objeto, recuerde que la JVM puede mover objetos (y frecuentemente lo hace cuando un recopilador de basura generacional promueve un objeto de larga vida a una generación anterior) para que la ubicación de almacenamiento de un objeto no un buen proxy para la identidad en todas las circunstancias.

+0

esto probablemente resolvería muy bien el problema de OP en sistemas de 32 bits. – irreputable

+0

El System.identityHashCode se basa actualmente en un generador aleatorio con un hilo por semilla – bestsss

+0

¿puedes elaborarlo? ¿Qué me proporciona System.idenetityHashCode (var)? Necesito algo que me permita determinar entre el mismo campo en un objeto diferente de una misma clase. – RanZilber

3

podría darle una oportunidad en este artículo de javaPaper: Address of a Java object

Se trata de utilizar la clase Unsafe en el paquete sun.misc para obtener la dirección.

+0

absolutamente aterrador. Nota * Inseguro * (el nombre fue elegido por una razón) y * sun.misc * (un paquete "específico" de implementación específica). También tenga en cuenta que esto es para la dirección * lógica * y no para la dirección * física *. +1 para un artículo interesante. –

+0

+1 por inseguro, es bueno. – bestsss

+1

Esto le dará la dirección de los campos dentro de un objeto, pero no el objeto mismo. –

1

Incluso si ha logrado obtener la dirección de montón del objeto, no hay garantía de que para cuando lo haya utilizado, el objeto aún está allí. El recolector de basura puede mover el objeto a otra ubicación en cualquier momento. A diferencia de .NET Java no es compatible con la fijación de memoria. Si busca insertar datos en una dirección del código nativo, DirectByteBuffer podría ser lo que necesita.

1

Además, es inseguro, que es bueno ... útil (lo he usado en un entorno de producción). Hay otra solución que no devolverá la dirección Java como puntero nativo. Se llama directamente java.nio.ByteBuffer, se diseñó teniendo exactamente esa idea en mente. La memoria asignada por ByteBuffer directo no está asignada en el montón de Java y no está sujeta a la recolección de basura estándar. Entonces, por supuesto, ByteBuffer ofrece el puntero directo vía ByteBuffer.address()

+0

eso no es lo que necesito aquí, porque no tengo idea acerca del código de entrada que obtengo. Pero me gusta esta idea, entonces +1; – RanZilber

0

Teniendo en cuenta sus objetivos, creo que la única solución es JVMTI. Usted asociaría un identificador único con cada objeto utilizando la operación {SetTag}. Luego escucha los eventos de {FieldModification}.

Cuestiones relacionadas