2016-12-09 4 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のこのバージョンは、残念ながらのみ又はプリミティブアレイにコピーする場合(宛先+代わりoffsettの絶対メモリアドレスとしてnullを提供することによって)メモリ領域をoffheapへのコピーのために働きます。

null以外のもの、またはプリミティブ配列を第3引数として指定しようとすると、java.lang.IllegalArgumentExceptionが表示されます。

Unsafe.copyMemory (long srcAddress, long destAddress, long bytes)を使用して、アドレスを直接入力することもできます(その間にオブジェクトが移動したために危険です)。

関連する問題