首页 > 解决方案 > 使用 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 实例中停止

标签: javadlljna

解决方案


我认为原因可能可以通过这个旧的 Microsoft 论坛帖子来解释:

您正在加载的每个 DLL 似乎都在使用TLS(线程本地存储)插槽。每个进程的 TLS 插槽数限制为 1088。从我读过的所有内容来看,限制很难......而且没有办法增加它。

根据我的阅读,DLL 不必使用TLS,因此您应该调查是否可以更改 DLL 的创建方式,以便它们不会这样做。


推荐阅读