使用 JNA 在 JAVA 中加载动态库是否有限制?
Is there a limit in loading dynamic libraries in JAVA using JNA?
早上好,
我们正在执行以下代码,并且在加载一定数量的 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 论坛可以解释原因 post:
您正在加载的每个 DLL 似乎都在消耗 TLS (thread local storage) slot。每个进程的 TLS 槽数限制为 1088。从我读过的所有内容来看,这个限制很难......而且没有办法增加它。
据我所知,DLL 不必 使用 TLS,因此您应该调查是否可以更改 DLL 的创建方式,以便它们不不要这样做。
早上好,
我们正在执行以下代码,并且在加载一定数量的 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 论坛可以解释原因 post:
您正在加载的每个 DLL 似乎都在消耗 TLS (thread local storage) slot。每个进程的 TLS 槽数限制为 1088。从我读过的所有内容来看,这个限制很难......而且没有办法增加它。
据我所知,DLL 不必 使用 TLS,因此您应该调查是否可以更改 DLL 的创建方式,以便它们不不要这样做。