2017-10-20 88 views
11

ile sarılmış bellek boşaltma JNI NewDirectByteBuffer ile sarılmış bir bellek bölgem var. ByteBuffer temizleyicide serbest/serbest bırakma kodunu çalıştırmak istiyorum. Bunu yapmanın bir yolu var mı, yoksa kullanıcının ByteBuffer ile arayacağı özel bir ücretsiz yöntem sunmak zorunda mıyım?NewDirectByteBuffer

Düzenleme

netleştirmek için, ben belleği kendim tahsis ve NewDirectByteBuffer kendim aradım. Temizleyiciyi nasıl temizleyeceğimi bilmek istiyorum.

+2

Java 8'in DirectByteBuffer'ında, genel bir API olmasa da Cleaner.clean() yöntemini çağırabilirsiniz, bu nedenle taşınabilir olmadığını bilmeniz gerekir. –

+0

@PeterLawrey Ve bu ücretsiz() her zaman arayacak? Free() işlevinden başka bir temizleme işlevine ihtiyacım varsa ne olur? –

+0

Belleği boşaltmak için uygun olan her şeyi yapar. Free() 'i çağırmayı içeren herhangi bir kanıtınız yok. – EJP

cevap

2

JNI.newDirectByteBuffer'u kullanırsanız, belleği el ile serbest bırakabilir ve aynı anda işinizi temizlersiniz.

Otomatik olarak temizlenmesini isterseniz, ihtiyacınız olan nesnenin yaşam döngüsünü izlemektir. Yalnızca API ile çalışmak ve yansımayı kullanmak istemezseniz, 'u ReferenceQueue ile kullanabilir ve kuyruğu yoklamak için bir iblis parçacığı oluşturabilirsiniz. Referans kuyruğunda referans yaptıktan sonra temizlik işinizi yapın.

+0

Lütfen soruyu okuyun. "ByteBuffer.allocateDirect" kullanmıyorum, JNI'den "NewDirectByteBuffer" kullanıyorum. 'NewDirectByteBuffer' serbest fonksiyon göstergesini almadığından, JVM hafıza bölgesini nasıl alacağını bilmenin bir yolu yoktur. 'ücretsiz' uygun olabilir veya olmayabilir. –

+0

'NewDirectByteBuffer', 'DirectByteBuffer' türünde bir iş döndürür. Yani çözüm aynıdır, ancak daha temizleyici oluşturmak için temizleyiciyi değiştirir. –

+0

Peki hangi serbest fonksiyonun çağrıldığını nasıl kontrol ediyorsunuz? –