簡體   English   中英

NIO直接緩沖區何時以及如何釋放?

[英]When and how are NIO direct buffers freed?

我有一個C庫,需要一個臨時緩沖區來暫存空間。 我正在考慮將直接字節緩沖區的地址傳遞給它。

  • 是否允許VM在最終釋放緩沖區之前重定位緩沖區? JNI框架消失后,本機庫將保留指針。 我的理解是,無法緩存JNI本地對象引用,因為VM可能會在GC期間重新定位它們。 這是否適用於緩沖區地址?

  • 我了解,如果我在Java中分配緩沖區,然后讓緩沖區對象超出范圍,則VM將釋放緩沖區內存。 如果我使用NewDirectByteBuffer在本機代碼中創建一個新緩沖區,誰負責釋放后備內存?

  • 如果我使用NewDirectByteBuffer和直接緩沖區已在使用的地址在本機代碼中創建新緩沖區,會發生什么情況? 內存會被釋放嗎? 當引用該內存的最后一個緩沖區被垃圾回收時,VM引用會計數該內存塊並嘗試釋放它嗎?

是否允許VM在最終釋放緩沖區之前重定位緩沖區?

它不會重定位,因為直接緩沖區不屬於GC堆。

如果我使用NewDirectByteBuffer在本機代碼中創建一個新緩沖區,誰負責釋放后備內存?

釋放它是您(本機代碼)的責任。 JVM不知道使用了什么方法來分配該后備存儲(可以被malloc分配,可以是一個靜態緩沖區,等等)。

如果我使用NewDirectByteBuffer和直接緩沖區已在使用的地址在本機代碼中創建新緩沖區,會發生什么情況?

由於VM不會嘗試釋放地址已傳遞給NewDirectByteBuffer的內存,因此,如果兩次傳遞相同的地址,則不會發生任何事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM