Можно ли получить адрес на кучу переменной в Java? - PullRequest
5 голосов
/ 10 января 2011

Допустим, у меня есть эта переменная:

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

и я хочу узнать, где находится var в куче (по адресу, например, 0x08 и т. Д.), И распечатать адрес.

возможно ли это?

Ответы [ 5 ]

8 голосов
/ 10 января 2011

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

. Вы можете использовать System.identityHashCode, чтобы получить представление о сходстве.Это не идеально, но это довольно хорошо.Если вы получаете адрес кучи объекта, помните, что JVM разрешено перемещать объекты (и часто это происходит, когда сборщик мусора поколений продвигает долгоживущий объект старшему поколению), поэтому расположение кучи объекта не являетсяхороший прокси для идентификации при любых обстоятельствах.

3 голосов
/ 10 января 2011

Вы можете попробовать эту статью в javaPaper: Адрес объекта Java

Речь идет об использовании класса Unsafe в пакете sun.misc для получения адреса.

1 голос
/ 10 января 2011

Помимо упомянутой Unsafe, которая хорошо ... полезна (я сам использовал ее в производственной среде). Есть еще одно решение, которое не будет возвращать адрес Java в качестве нативного указателя, оно называется прямым java.nio.ByteBuffer, оно было разработано именно с этой идеей. Он выделил память прямым ByteBuffer, не выделяется в куче Java и не является предметом стандартной сборки мусора. Затем, конечно, ByteBuffer предлагает прямой указатель через ByteBuffer.address ()

1 голос
/ 10 января 2011

Даже если вам удалось получить адрес кучи объекта, нет гарантии, что к тому времени, когда вы его используете, объект все еще там. Сборщик мусора может переместить объект в другое место в любое время. В отличие от .NET Java не поддерживает закрепление памяти. Если вы хотите вставить данные в адрес из собственного кода, то DirectByteBuffer может быть тем, что вам нужно.

0 голосов
/ 11 января 2011

Учитывая ваши цели, я думаю, что единственное решение - JVMTI .Вы бы связали уникальный идентификатор с каждым объектом, используя операцию {SetTag}.Затем прослушайте события {FieldModification}.

...