2016-12-09 1 views
2

У меня проблема с copyMemory из Unsafe. Я провел 2 дня в разрешении, но без результата. Приведенный ниже код всегда заканчивается знаком «IllegalArgumentException». Можете ли вы мне помочь и показать, где проблема?Java Unsafe.copyMemory java.lang.IllegalArgumentException

public void testMemoryCopy() { 
    class A { 
     public long val = 10; 
    } 
    A a0 = new A(); 
    A a1 = new A(); 

    try { 
     long offset = unsafe.objectFieldOffset(A.class.getField("val")); 
     unsafe.copyMemory(a0, offset, a1, offset, 8); 
    } catch (NoSuchFieldException e) { 
     e.printStackTrace(); 
    } catch (SecurityException e) { 
     e.printStackTrace(); 
    } 
} 

ответ

1

Эта версия Unsafe.copyMemory, к сожалению, работает только для копирования на offheap области памяти (путем предоставления null в качестве пункта назначения + а абсолютного адреса памяти вместо offsett) или при копировании на примитивный массива.

При попытке указать что-либо еще, кроме null или массива primitve в качестве третьего аргумента, вы получите java.lang.IllegalArgumentException.

В качестве альтернативы вы можете использовать Unsafe.copyMemory (long srcAddress, long destAddress, long bytes) и напрямую предоставлять адреса (что, конечно же, сопряжено с риском, так как объекты могли перемещаться за это время).

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