2017-10-20 69 views
11

Mam obszar pamięci owinięty JNI NewDirectByteBuffer. Chciałbym uruchomić kod darmowy/zwolnienia w urządzeniu czyszczącym ByteBuffer. Czy istnieje sposób, aby to zrobić, czy też mam do zaoferowania niestandardową, darmową metodę, z której użytkownik będzie musiał zadzwonić pod numer ByteBuffer?Zwolnienie pamięci zapakowanej w NewDirectByteBuffer

Edit

celu wyjaśnienia, że ​​przydzielone pamięci siebie i nazywa NewDirectByteBuffer siebie. Chciałbym wiedzieć, w jaki sposób powinienem skoordynować czyszczenie z urządzeniem czyszczącym.

+2

W DirectByteBuffer Java 8 można wywołać metodę Cleaner.clean(), chociaż nie jest to publiczny interfejs API, więc należy użyć wiedzy, że nie jest przenośny. –

+0

@PeterLawrey A to będzie wywoływać free() zawsze? Co jeśli potrzebuję innej funkcji czyszczenia niż wolna()? –

+0

Zrobi wszystko, co jest właściwe, aby uwolnić pamięć. Nie masz żadnych dowodów, że wymaga to wywołania 'free()'. – EJP

Odpowiedz

2

Używasz JNI.newDirectByteBuffer, możesz i powinieneś zwolnić pamięć ręcznie, i czyścicie pracę w tym samym czasie.

Jeśli chcesz automatycznie wyczyścić urządzenie, musisz monitorować cykl życia obiektu. A jeśli chcesz tylko pracować z API i nie używać refleksji, możesz użyć PhantomReference z ReferenceQueue i utworzyć demoniczny wątek do sondowania kolejki. Wykonaj swoje czyszczenie, gdy referencja znajdzie się w kolejce referencyjnej.

+0

Proszę przeczytać pytanie. Nie używam 'ByteBuffer.allocateDirect', używam' NewDirectByteBuffer' od JNI. Ponieważ 'NewDirectByteBuffer' nie pobiera wolnego wskaźnika funkcji, JVM nie ma możliwości poznania sposobu zwolnienia obszaru pamięci. "wolny" może lub nie być odpowiedni. –

+0

'NewDirectByteBuffer' zwraca zadanie, które jest typem 'DirectByteBuffer'. Rozwiązanie jest takie samo, ale od zmiany środka czyszczącego, aby stworzyć środek czyszczący. –

+0

Jak kontrolować, która funkcja bezpłatna jest wywoływana? –