Использование sun.misc.Unsafe для получения адреса элементов массива Java? - PullRequest
6 голосов
/ 29 октября 2011

Я изо всех сил пытаюсь понять документацию sun.misc.Unsafe - я полагаю, поскольку он не предназначен для общего использования, никто не потрудился сделать его читабельным, но мне действительно очень нужен способ найти адресэлемент в массиве (чтобы я мог передать на него указатель на нативный код).У кого-нибудь есть какой-нибудь рабочий код, который делает это?Это надежно?

Ответы [ 3 ]

6 голосов
/ 29 октября 2011

Вместо использования массива вы можете использовать прямой буфер ByteBuffer.allocateDirect (). У этого есть адрес в поле, и этот адрес не изменяется в течение жизни ByteBuffer. Прямой ByteBuffer использует минимальное пространство кучи. Вы можете получить адрес, используя отражение.


Вы можете использовать Unsafe для получения адреса, проблема в том, что GC может переместить его в любое время. Объекты не фиксируются в памяти.

В JNI вы можете использовать специальные методы для копирования данных в / из объектов Java, чтобы избежать этой проблемы (и других). Я предлагаю вам использовать их, если вы хотите обмениваться данными между объектами с кодом C.

6 голосов
/ 29 октября 2011

Вот рабочий образец. Однако будьте осторожны, так как вы можете легко разбить JVM при неправильном использовании класса Unsafe.

import java.lang.reflect.Field;

import sun.misc.Unsafe;

public class UnsafeTest {

    public static void main(String... args) {
        Unsafe unsafe = null;

        try {
            Field field = sun.misc.Unsafe.class.getDeclaredField("theUnsafe");
            field.setAccessible(true);
            unsafe = (sun.misc.Unsafe) field.get(null);
        } catch (Exception e) {
            throw new AssertionError(e);
        }

        int ten = 10;
        byte size = 1;
        long mem = unsafe.allocateMemory(size);
        unsafe.putAddress(mem, ten);
        long readValue = unsafe.getAddress(mem);
        System.out.println("Val: " + readValue);

    }
}
1 голос
/ 29 октября 2011

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

...