2016-12-09 20 views
2

我有一個從不安全的copyMemory問題。 我花了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)並直接提供地址(當然,因爲對象可能在此期間移動,所以這當然是有風險的)。

相關問題