2016-12-09 3 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 또는 primitve 배열을 세 번째 인수로 지정하려고하면 java.lang.IllegalArgumentException이 표시됩니다.

또는 Unsafe.copyMemory (long srcAddress, long destAddress, long bytes)을 사용하고 직접 주소를 제공 할 수 있습니다 (물론 그 동안 개체가 움직일 수 있으므로 위험합니다).