Как уникально отличить экземпляр объекта Java - PullRequest
6 голосов
/ 09 марта 2012

В настоящее время я создаю собственный агент JVMTI для Java 1.7. Проблема в том, что мне нужно проиндексировать некоторые данные, относящиеся к конкретным экземплярам объектов Java. Поэтому мой вопрос заключается в том, могу ли я использовать значение типа задания в качестве идентификатора экземпляра объекта для извлечения моих проиндексированных данных?

Я искал любую информацию о том, что такое семантика типа заданий. Это указатель на расположение объекта в памяти? Это адрес указателя стека? Это адрес внутренней структуры JVM? Поэтому я не могу понять, является ли значение jobject уникальным и неизменным в течение жизни Java-объекта.

Спасибо за вашу помощь.

редактировать

В соответствии со спецификациями JNI, найденными здесь , jobject представляется указателем на экземпляр объекта.

Ответы [ 2 ]

2 голосов
/ 10 марта 2012

Когда вы говорите, что «значение типа задания», я предполагаю, что вы имеете в виду значение, возвращаемое toString . Если вы посмотрите на документ Java, он утверждает, что:

Метод toString для класса Object возвращает строку, состоящую из имени класса, экземпляром которого является объект, символа знака «@» и шестнадцатеричного представления без знака хеш-кода объекта. Другими словами, этот метод возвращает строку, равную значению:

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

И если вы посмотрите на документ Java для метода hashCode , то в нем говорится:

Всякий раз, когда он вызывается для одного и того же объекта более одного раза во время выполнения приложения Java, метод hashCode должен последовательно возвращать одно и то же целое число

, а также

Насколько это практически целесообразно, метод hashCode, определенный классом Object, возвращает разные целые числа для разных объектов. (Обычно это реализуется путем преобразования внутреннего адреса объекта в целое число, но этот метод реализации не требуется языком программирования JavaTM.)

Обновление: Ответ на комментарий Райана: System.identityHashCode вернет вам исходный хеш-код, даже если метод хеш-кода будет переопределен. Однако, как отмечают комментарии, это не совсем уникально.

Так что я думаю, что ответ на ваши вопросы - да, он неизменный и очень вероятно, что он будет уникальным, но вы должны прочитать документы или исходный код для вашей JVM.

1 голос
/ 23 февраля 2013

По крайней мере, в HotSpot jobject действительно является указателем на местоположение объекта, то есть разыменование дает вам адрес, уникальный для каждого объекта, что составляет половину «уникальной и неизменной идентичности», о которой вы спрашиваете.,Проблема в том, что адрес может меняться во время сбора мусора, поскольку HotSpot может перемещать объекты.

Функции JVMTI GetTag и SetTag внутренне используют хеш-таблицу от местоположения объекта до тега.HotSpot обновляет эту хеш-таблицу всякий раз, когда объекты перемещаются, что вы не можете легко воспроизвести с позиции агента JVMTI.Присвоение собственных уникальных значений идентификаторов с помощью тегов, как вы говорите, уже делает, вероятно, единственный способ пойти сюда.

...