2016-12-09 5 views
2

Ich habe ein Problem mit CopyMemory von Unsafe. Ich verbrachte 2 Tage damit, es zu lösen, aber ohne Ergebnis. Der unten dargestellte Code endet immer mit "IllegalArgumentException". Können Sie mir helfen und zeigen, wo das Problem liegt?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(); 
    } 
} 

Antwort

1

Diese Version von Unsafe.copyMemory leider funktioniert nur für das Kopieren Speicherbereiche offheap (von null als Ziel die Bereitstellung + eine absolute Speicheradresse anstelle eines offsett) oder wenn sie auf eine primitive Array zu kopieren.

Wenn Sie versuchen, etwas anderes als null oder ein primitve-Array als drittes Argument anzugeben, erhalten Sie eine java.lang.IllegalArgumentException.

Alternativ können Sie die Unsafe.copyMemory (long srcAddress, long destAddress, long bytes) verwenden und direkt die Adressen angeben (was natürlich riskant ist, da sich die Objekte in der Zwischenzeit verschoben haben könnten).

Verwandte Themen