簡體   English   中英

釋放Java中的本機庫分配的內存

[英]Releasing Memory Allocated by Native Libraries in Java

如果您正在運行使用Java調用本機庫的代碼,那么當內存分配應該持續對象的生命周期時,釋放這些庫分配的內存的常用方法是什么? 在C ++中,我會使用析構函數,但Java從來沒有真正擁有它們, 現在它們更少

我最感興趣的具體情況是JOCL ,其中我有一個包裝已編譯的OpenCL內核的對象以及始終相同的所有參數。 表示已編譯內核和參數的結構都在庫側分配,並且JOCL提供了一個方法clReleaseMemObject ,您調用該方法來遞減引用計數器,指示何時應刪除該對象(請注意,這與直接釋放內存有點不同) ,但在這種情況下,我並不認為如此)。

我假設如果對象在程序終止時仍然存在,那么操作系統會清理所有內容,但我不太確定在線程中創建的對象。 所以:

  1. 如果您希望在對象被垃圾回收時釋放本機內存,是否有適當的位置來調用釋放此內存的方法?

  2. 如果對象是一個將持續一個線程持續時間的對象,是否有適當的地方進行此調用,或者這甚至是必要的?

你能做的就是使用清潔劑 這是Java 9中更官方的API,但可以在Java 1.4+中使用。

基本上你給它一個Runnable來清理資源時執行。

使用Cleaner的一個優點是你可以確定地調用它來清理,但如果你忘記或不這樣做,GC會在它運行后調用它。

當線程死亡時,沒有一種安全的方法來清理對象,因為Thread對象可以在程序的生命周期中存活,即使它已經死了。 一種更簡單的方法是清理,因為您知道不需要它或GC確定不需要它。

另一種方法是使用引用隊列和后台線程。 它並不優雅,但適用於Java 8及更高版本。

暫無
暫無

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

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