2017-10-20 19 views
11

메모리 영역에 JNI NewDirectByteBuffer이 있습니다. ByteBuffer의 클리너에서 무료/릴리스 코드를 실행하고 싶습니다. 이 작업을 수행 할 수있는 방법이 있습니까? 아니면 사용자가 ByteBuffer으로 전화해야 할 맞춤 무료 메서드를 제공해야합니까?NewDirectByteBuffer로 래핑 된 메모리 해제

편집

명확히하기 위해, 나는 메모리 나 자신을 할당 NewDirectByteBuffer에게 자신을 불렀다. 청소기를 어떻게 정리해야하는지 알고 싶습니다.

+2

Java 8의 DirectByteBuffer에서는 public API가 아니지만 Cleaner.clean() 메서드를 호출 할 수 있으므로 이식성이 없다는 것을 알고 사용하십시오. –

+0

@PeterLawrey 그리고 그것은 항상 free()를 호출 할 것인가? free()보다 다른 정리 기능이 필요한 경우 어떻게합니까? –

+0

메모리를 확보하는 데 필요한 모든 작업을 수행합니다. 당신은'free()'를 호출하는 증거가 없습니다. – EJP

답변

2

JNI.newDirectByteBuffer을 사용할 수 있으며 수동으로 메모리를 확보해야하며 동시에 작업을 정리해야합니다.

자동으로 정리하려면 개체의 수명주기를 모니터링해야합니다. API로만 작업하고 리플렉션을 사용하지 않으려는 경우 PhantomReferenceReferenceQueue과 함께 사용하고 대기열을 폴링하는 데몬 스레드를 만들 수 있습니다. 참조가 참조 대기열에 있으면 작업을 정리하십시오.

+0

질문을 읽어보십시오. 'ByteBuffer.allocateDirect'를 사용하지 않고 JNI에서'NewDirectByteBuffer'를 사용하고 있습니다. 'NewDirectByteBuffer'는 자유 함수 포인터를 가지지 않기 때문에 JVM은 메모리 영역을 비우는 방법을 알 길이 없습니다. '자유'는 적절할 수도 적절하지 않을 수도 있습니다. –

+0

'NewDirectByteBuffer'는'DirectByteBuffer' 타입의 jobject를 리턴합니다. 따라서 솔루션은 동일하지만 청소기를 변경하여 청소기를 만드십시오. –

+0

그래서 어떤 자유 함수가 호출되는지 어떻게 제어합니까? –