2012-03-09 5 views
6

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

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

Благодарим за помощь.

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

Согласно спецификации JNI нашли here, jobject кажется, указатель на экземпляр Object.

+0

Что вы сделали до сих пор и какой именно тип информации вы пытаетесь получить и индексируете или извлекаете на основе того, что вы получили? –

+0

Может быть похоже: http://stackoverflow.com/questions/909843/java-how-to-get-the-unique-id-of-an-object-which-overrides-hashcode –

+0

На самом деле, мой вопрос о агентом JVMTI, написанным на C. Я хочу использовать экземпляр Object в качестве первичных ключей для цели кеширования (реализован как хэш-карта или красно-черное дерево, например). Теперь я помечаю каждый объект уникальным идентификатором благодаря SetTag & GetTag. – Gu0sur20

ответ

2

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

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

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

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

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

, а также

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

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

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

+0

HashCode уникален для каждого объекта. Тем не менее, он должен быть переопределен, если вы переопределите равные, так что он будет таким же, как любой другой объект, эквивалентный равным. –

+3

@ Ryan Нет, это конечно ** не ** всегда уникальный. Совершенно очевидно: вам будет сложно гарантировать уникальный идентификатор с использованием 32 битов в 64-битной системе. – Voo

+0

Кроме того, контракт equals/hashcode говорит, что 2 одинаковых объекта имеют одинаковый хэш-код. Поэтому, если два объекта были семантически равными, их хэш-коды должны быть одинаковыми. Два неравных объекта могут иметь один и тот же хэш-код, поэтому System.identityHashCode (или любая реализация хэш-кода) не может гарантировать уникальность. –

1

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

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

Смежные вопросы