ライブラリファイルをsystem.loadLibrary()関数を使用してロードした直後にライブラリファイルを削除することはできますか?ここにシナリオがあります...JVMにロードした後の一時ファイルの削除
私たちはJavaアプリケーションから呼び出すためにC言語で書かれたDomainSocketユーティリティを使用するためにJNIを使用しています。 .SOファイルを同じjarにパッケージングし、ユーティリティを使用してファイルシステム上に一時ファイルを作成し、loadLibrary関数を使用して.SOをロードします。一意の一時ファイルを作成するFile.createTempFile()を使用しています。 deteleOnExit()を使用して、JVMのシャットダウン時に一時ファイルを削除しています。
JVMのスタンドアロンアプリケーションでは、これは問題なく動作します。しかし、同じJVM上で複数のアプリケーションを実行できるので、TomcatのようなWebコンテナにデプロイするときに問題があります。まず、展開された各アプリケーションごとに一時ファイルが作成されます。本当の問題は、Appが停止して起動または再デプロイされたときに、一時ファイルが削除されずに新しいファイルが作成されることです。 JVMがシャットダウンすると、すべての一時ファイルが削除されます(Tomcatが再起動されます)。
loadLibrary()の後に一時ファイルを削除する方法を試しました。これはうまくいくようです。再起動時に新しい一時ファイルが作成され、ロード直後に削除されます。
誰かがポインタ/提案を持っているかどうか確認したいと思っていましたか?
これらの.SOファイルをアプリケーションの一部にしたいので、common/libメカニズムを使用して.SOファイルをコンテナごとに一度だけロードすることは望ましくありません。
ライブラリをいつでもアンロードできると言ったときに、どのOSを参照していますか? – apangin
@apangin私が気にしていた特定のOSはありません。しかし、POXIXなどのコードはロードされず、ディスクベースのアーティファクトは自由に消えるという要件はありません。私は、 "定義されていない動作"がロードされた結果、ディスクから共有ライブラリを削除した結果と期待します。 –
さて、共有ライブラリが削除されたときにアプリケーションがクラッシュする原因となるOS(少なくともOracle JDKでサポートされているOS)はわかりません。通常、OSは削除を拒否(Windows)するか、ファイルのデータをディスクに保存したままファイル名のリンクを解除(Linux)します。ファイルを削除しても、すでに開いているこのファイルのメモリマッピングには影響しません。 – apangin