java - 使用 JNA 在 JAVA 中加载动态库是否有限制?
问题描述
早上好,
我们正在执行以下代码,并且在加载一定数量的 dll 时收到错误消息:
File file = new File("C:\\Users\\jevora\\Downloads\\dng_tests\\dllsCopies");
file.mkdirs();
for (int i = 1; i < 10000; i++) {
String filename = "heatedTankCvode" + i + ".dll";
Files.copy(new File("C:\\Users\\jevora\\Downloads\\dng_tests\\heatedTankCvode.dll").toPath(),
new File(file, filename).toPath(), StandardCopyOption.REPLACE_EXISTING);
NativeLibrary.getInstance(new File(file, filename).getAbsolutePath());
System.out.println("Loaded: " + filename);
}
正如您在此处看到的,我们想使用 JNA 加载 10,000 个 dll。但是,在以下日志中,进程在加载实例 1,051 时停止:
Loaded: heatedTankCvode1048.dll
Loaded: heatedTankCvode1049.dll
Loaded: heatedTankCvode1050.dll
Exception in thread "main" java.lang.UnsatisfiedLinkError: Unable to load library 'C:\Users\jevora\Downloads\dng_tests\dllsCopies\heatedTankCvode1051.dll': Native library (win32-x86-64/C:\Users\jevora\Downloads\dng_tests\dllsCopies\heatedTankCvode1051.dll)
关于代码,首先我们将 dll 复制到具有不同名称的新位置,然后尝试加载它。我们想知道可以加载的 dll 数量是否有限制。有限制吗?我们能克服它吗?
提前致谢
编辑:我尝试了几种内存配置,它总是在 1051 实例中停止
解决方案
我认为原因可能可以通过这个旧的 Microsoft 论坛帖子来解释:
您正在加载的每个 DLL 似乎都在使用TLS(线程本地存储)插槽。每个进程的 TLS 插槽数限制为 1088。从我读过的所有内容来看,限制很难......而且没有办法增加它。
根据我的阅读,DLL 不必使用TLS,因此您应该调查是否可以更改 DLL 的创建方式,以便它们不会这样做。
推荐阅读
- php - 从 html 表单中获取收件人
- python - 运行 Django 时出错:ModuleNotFoundError: No module named 'pyshop.settings'
- spring - 将 Spring Boot 应用程序部署到 Heroku 时出错
- mongoose - 为什么mongoose throw $strLenCP需要字符串参数,使用$exists后发现:null
- python - 熊猫数据框过滤器包含('。'),Python 3.6
- perl - Perl `defined` 函数复杂度
- windows - 在 bat 文件的 else 语句中无法识别变量
- javascript - 刷新页面时,反冲不持久状态
- reactjs - 如何在下一个js中设置默认页面?
- replace - 如何在julia中替换字符串中的几个字符