2010-04-29 2 views
3

Возможно ли, что мы можем напрямую или косвенно получить доступ к ячейке памяти в Java?Как получить доступ к памяти в Java?

Если мы попытаемся напечатать объект, он напечатает hashcode. Указывает ли hashcode косвенно на местоположение памяти?

Для двух объектов в разных местах памяти, но все же их хэш-код может варьироваться.

-Abhishek

+3

Зачем вам это нужно? –

+0

Как @Valetin предлагает вам не нужно. Если у вас есть очень конкретные причины для этого, например, пишу драйвер устройства, я предлагаю вам использовать JNI с C/C++. –

ответ

12

Возможно ли, что мы можем получить доступ ячейку памяти в Java прямо или косвенно ?

No.

+7

Да: sun.misc.Unsafe – gubby

2

Вероятно, не для примитивного типа данных. Возможно, вы сможете получить адреса областей данных, используемых для хранения объектов в ссылочном типе, хотя Java Native Interface, мы можем получить доступ к C++ или C, и из этого мы можем получить местоположение памяти.

Это своего рода бессмысленно. Из-за сбора мусора любой объект Java может перемещаться в памяти в любое время, когда какой-либо поток создает новый объект.

7

Нет, hashcode, в общем, не имеет ничего общего с местоположением памяти. Расположение памяти вашего объекта является ссылкой на объект.

Однако не может быть совершенно невозможно выжать фактическое местоположение. Java hashcode Java Object, согласно его javadoc, обычно реализуется путем преобразования внутреннего адреса объекта в целое число, но этот метод реализации не требуется языком программирования Java. И есть метод System#identityHashCode(Object), который вернет тот же хэш-код для данного объекта, который будет возвращен методом hashCode() по умолчанию (то есть Object hashCode()). Таким образом, вы действительно сможете получить фактическое местоположение памяти. Но независимо от того, работает ли это, как сказано выше, зависит от реализации. И поскольку вы определенно не сможете напрямую читать/записывать в память, даже если знаете местоположение, что бы вы сделали с этой информацией?

2

Вы можете читать/записывать адреса памяти, если для этого предусмотрен какой-либо API. В Sun/Oracle JRE sun.misc.Unsafe вы можете сделать это, хотя преднамеренно вам нужно пройти через обручи, чтобы получить экземпляр.

+2

Не стоит ничего, что небезопасно не дает вам местоположение объекта, такого как указатель, на C. Однако использование этого класса неправильно может привести к сбою JVM, иногда неожиданным образом. Обращайтесь с осторожностью. –

+0

@Peter Lawrey: Да, вы можете получить доступ к памяти относительно объекта (для чтения полей экземпляра) или получить доступ к памяти в абсолютном местоположении. Объекты перемещаются в памяти, поэтому адрес объекта имеет ограниченное значение. –

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