dll使用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加载10000个DLL。但是,在下面的日志中,进程在加载实例1051时停止:
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实例中停止
# 1 楼答案
我认为原因可以用微软论坛的这篇老帖子来解释:
似乎正在加载的每个DLL都在使用TLS (thread local storage) slot。每个进程的TLS插槽数量限制为1088个。从我读到的所有资料来看,限制是很难的。。。而且没有办法增加它
从我读到的内容来看,DLL不必使用TLS,所以你应该研究一下你是否可以改变DLL的创建方式,这样它们就不会这样做