문제

스크래치 공간을위한 임시 버퍼를 원하는 C 라이브러리가 있습니다. 직접 바이트 버퍼의 주소를 전달하는 것을 고려하고 있습니다.

  • VM이 버퍼가 궁극적으로 해제되기 전에 버퍼를 재배치 할 수 있습니까? JNI 프레임이 사라진 후 기본 라이브러리가 포인터를 붙잡을 것입니다. 내 이해는 JNI 로컬 객체 참조를 GC 동안 VM을 재배치 할 수 있기 때문에 캐시 할 수 없다는 것입니다. 버퍼 주소에 적용됩니까?

  • Java에 버퍼를 할당 한 다음 버퍼 객체를 범위를 벗어나게하면 VM이 버퍼 메모리를 자유롭게 할 것임을 이해합니다. NewDirectByteBuffer를 사용하여 기본 코드로 새 버퍼를 만들면 백킹 메모리를 해제해야 할 책임이 있습니까?

  • NewDirectByteBuffer와 직접 버퍼가 이미 사용중인 주소를 사용하여 기본 코드로 새 버퍼를 작성하면 어떻게됩니까? 메모리가 이중으로 자유롭게 될까요? VM 참조는 메모리 블록을 계산하고 마지막 버퍼 참조를 수집 할 때 해방하려고 시도합니까?

도움이 되었습니까?

해결책

VM이 버퍼가 궁극적으로 해제되기 전에 버퍼를 재배치 할 수 있습니까?

직접 버퍼가 GC 힙의 일부가 아니기 때문에 재배치하지 않습니다.

NewDirectByteBuffer를 사용하여 기본 코드로 새 버퍼를 만들면 백킹 메모리를 해제해야 할 책임이 있습니까?

그것을 해방시키는 것은 당신의 (기본 코드) 책임입니다. JVM은 해당 백킹 스토어를 할당하는 데 어떤 방법이 사용되었는지 알 수 없었습니다 (Malloc'd, 정적 버퍼 일 수 있음 등).

NewDirectByteBuffer와 직접 버퍼가 이미 사용중인 주소를 사용하여 기본 코드로 새 버퍼를 작성하면 어떻게됩니까?

VM이 주소가 NewDirectByteBuffer로 전달되는 메모리를 제거하려고 시도하지 않으면 동일한 주소를 두 번 전달하면 아무 일도 일어나지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top