在使用system.loadLibrary()函數加載後,刪除庫文件是否正確?這裏是場景...加載到JVM中後刪除臨時文件
我們使用JNI來使用用C語言編寫的DomainSocket實用程序從Java應用程序調用。我們將.SO文件打包到同一個jar文件中,並使用實用程序在文件系統上創建臨時文件,並使用loadLibrary函數加載.SO文件。我們使用File.createTempFile()來創建一個唯一的臨時文件。我們正在使用deteleOnExit()來刪除JVM關閉時的臨時文件。
在JVM上的獨立應用程序中,此工作正常。但是我們在部署到像Tomcat這樣的Web容器時遇到了問題,因爲我們可以在同一個JVM上運行多個應用程序。首先爲每個部署的應用程序創建一個臨時文件。真正的問題是,當App停止並啓動或重新部署時,臨時文件不會被刪除,而是會創建一個新文件。當JVM關閉時(Tomcat重新啓動),所有臨時文件都將被刪除。
我們試驗了一個解決方案,在loadLibrary()之後刪除臨時文件。這似乎工作正常。在重新啓動時創建一個新的臨時文件,並在加載後立即刪除。
想檢查是否有人有一些指標/建議?
我們不希望使用common/lib機制僅爲每個容器加載.SO文件一次,因爲我們希望使這些.SO文件成爲應用程序的一部分。
你說什麼操作系統可以隨時卸載庫? – apangin
@apangin我沒有想到特定的操作系統。但是沒有POXIX等要求代碼保持加載狀態,因此基於磁盤的工件可以自由消失。我希望「未定義的行爲」是加載的結果,然後從磁盤上刪除共享庫。 –
嗯,我不知道在刪除共享庫時會導致應用程序崩潰的操作系統(至少在Oracle JDK支持之中)。通常,操作系統會拒絕刪除(Windows)或者只是取消鏈接文件名(Linux),將文件數據保存在磁盤上。刪除文件不會影響已打開的文件的內存映射。 – apangin