gpt4 book ai didi

java - 加载到 JVM 后删除临时文件

转载 作者:搜寻专家 更新时间:2023-10-31 20:32:50 24 4
gpt4 key购买 nike

在使用 system.loadLibrary() 函数加载库文件后立即删除它是否可以...?这是场景...

我们使用 JNI 来使用用 C 语言编写的 DomainSocket 实用程序从 Java 应用程序调用。我们将 .SO 文件打包到同一个 jar 中,并使用实用程序在文件系统上创建临时文件并使用 loadLibrary 函数加载 .SO。我们正在使用 File.createTempFile() 创建一个唯一的临时文件。我们使用 deteleOnExit() 在 JVM 关闭时删除临时文件。

在 JVM 上的独立应用程序上,这工作正常。但是当部署到像 Tomcat 这样的 Web 容器时我们会遇到一个问题,因为我们可以在同一个 JVM 上运行多个应用程序。首先为每个部署的应用程序创建一个临时文件。真正的问题是,当应用程序停止并启动或重新部署时,临时文件并没有被删除,而是创建了一个新文件。当 JVM 关闭(Tomcat 重新启动)时,所有临时文件都将被删除。

我们尝试了一种在 loadLibrary() 之后删除临时文件的解决方案。这似乎工作正常。一个新的临时文件在重新启动时创建并在加载后立即删除。

想看看是否有人有一些指示/建议?

我们不想使用 common/lib 机制在每个容器中只加载一次 .SO 文件,因为我们想让这些 .SO 文件成为应用程序的一部分。

最佳答案

Is it ok to delete a library file right after we load it using the system.loadLibrary() function...?

没有。操作系统可以随时“卸载”库,并且可能需要从磁盘重新加载二进制文件。如果您删除该文件(并且它实际上并没有被该进程保持打开状态),那么您将得到一些非常奇怪的行为......可能类似于“总线错误”或其他几乎无法解释的情况。

即使库没有从内存中删除并从磁盘重新加载,各种操作系统都有“延迟加载”标志和其他可能让您进入竞争条件的情况,您可能会删除磁盘上的在实际从中加载所有代码之前的库工件。

We are using the File.createTempFile() which create a unique temp file. We are using the deleteOnExit() to delete the temp file on JVM shutdown.

除了您遇到的问题外,这似乎是一种合理的方法。为什么不使用 File.createTempFile,而是在可预测的地方使用可预测的文件名(例如 /tmp/libgoodstuff.so)?如果这样做,那么您只需创建(并安排删除)一个文件(每个您要加载的库)。

[I] wanted to check if anybody has some pointers/suggestions?

.so 文件放在应用程序中将很难管理,除非您真的非常了解您的目标环境。例如,您需要确保目标架构和操作系统正确无误等。

归根结底,本地库作为可分发应用程序的一部分是 Java 的一个难题,应该避免,除非没有其他选择。

关于java - 加载到 JVM 后删除临时文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36252994/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com