2012-03-09 8 views
6

Actualmente estoy creando un agente JVMTI nativo para Java 1.7. El problema es que necesito indexar algunos datos con respecto a las instancias de objetos de Java específicas. Entonces mi pregunta es ¿puedo usar el valor de tipo de objeto de trabajo como ID de instancia de un objeto para recuperar mis datos indexados?Cómo distinguir de manera única la instancia de objeto de Java

He buscado cualquier información sobre cuál es la semántica del tipo de proyecto de trabajo. ¿Es un puntero en la ubicación de la memoria de Object? ¿Es una dirección de puntero de pila? ¿Es una dirección a la estructura interna de una JVM? Así que no puedo entender si el valor de Jobject es único e inmutable a lo largo de la vida del objeto Java.

Gracias por su ayuda.

edición

De acuerdo con las especificaciones del JNI encontró here, jobject parece que hay un puntero en la instancia del objeto.

+0

¿qué ha hecho hasta ahora y cuál es el tipo exacto de información que está tratando de obtener e indexar o recuperar en función de lo que ha obtenido? –

+0

Puede ser similar: http://stackoverflow.com/questions/909843/java-how-to-get-the-unique-id-of-an-object-which-overrides-hashcode –

+0

De hecho, mi pregunta es sobre un agente JVMTI escrito en C. Quiero utilizar la instancia de Object como claves principales para el propósito de caché (implementado como un mapa hash o un árbol rojo-negro, por ejemplo) Por ahora estoy etiquetando cada objeto con una identificación única gracias a SetTag & GetTag funciones. – Gu0sur20

Respuesta

2

Cuando dices "valor del tipo de objeto de trabajo" supongo que te refieres al valor devuelto por el toString. Si nos fijamos en el doc java Afirma que:

El método toString de la clase Object devuelve una cadena formada por el nombre de la clase de la que el objeto es una instancia, el carácter arroba '@', y la representación hexadecimal sin signo del código hash del objeto. En otras palabras, este método devuelve una cadena igual al valor de:

getClass().getName() + '@' + Integer.toHexString(hashCode()) 

Y si nos fijamos en el documento de Java para el método hashCode afirma:

Cada vez que se invoca en el mismo objeto más de una vez durante una ejecución de una aplicación Java, el método hashCode debe volver consistentemente el mismo entero

y también

Tanto como sea razonablemente práctico, el método hashCode definido por la clase Object devuelve enteros distintos para objetos distintos. (Esto se implementa típicamente mediante la conversión de la dirección interna del objeto en un entero, pero esta técnica de implementación no es requerida por el lenguaje de programación Java ™.)

Actualización: Respuesta al comentario de Ryan: System.identityHashCode le conseguirá el original código hash incluso si el método hashcode está anulado. Sin embargo, como los comentarios notan, no es realmente único.

Así que supongo que la respuesta a sus preguntas es sí, es inmutable y es muy probable que sea única, pero debe leer los documentos o el código fuente de su JVM.

+0

HashCode es único para cada objeto. Sin embargo, se supone que debe anularse si anula iguales, de modo que será igual a cualquier otro objeto que sea equivalente por iguales. –

+3

@Ryan No, ciertamente ** no ** es siempre único. Obviamente, así: tendrás dificultades para garantizar un identificador único con 32bits en un sistema de 64 bits. – Voo

+0

Además, el contrato equal/hashcode dice que 2 objetos iguales tienen el mismo código hash. Entonces, si dos objetos son semánticamente iguales, sus códigos hash deberían ser los mismos. Sin embargo, dos objetos desiguales pueden tener el mismo código hash, por lo que System.identityHashCode (o cualquier implementación de código hash) no puede garantizar la exclusividad. –

1

Al menos en HotSpot, jobject es de hecho un puntero a una ubicación de objeto, es decir, desreferenciando le dará una dirección que es única para cada objeto, que es la mitad de la "identidad única e inmutable" que usted pregunta acerca de. El problema es que la dirección puede cambiar durante la recolección de basura, ya que HotSpot puede mover objetos.

Las funciones JVMTI GetTag y SetTag utilizan internamente una tabla hash desde la ubicación del objeto hasta la etiqueta.HotSpot actualiza esta tabla hash cada vez que se mueven objetos, algo que no se puede replicar fácilmente desde la posición de un agente JVMTI. Asignar sus propios valores de identidad únicos con las etiquetas, como dices que ya estás haciendo, es probablemente la única manera de hacerlo aquí.

Cuestiones relacionadas