有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    我认为原因可以用微软论坛的这篇老帖子来解释:

    似乎正在加载的每个DLL都在使用TLS (thread local storage) slot。每个进程的TLS插槽数量限制为1088个。从我读到的所有资料来看,限制是很难的。。。而且没有办法增加它

    从我读到的内容来看,DLL不必使用TLS,所以你应该研究一下你是否可以改变DLL的创建方式,这样它们就不会这样做