【问题标题】:Java: When DLLs are loaded by a ClassLoader where are they stored in memory?Java:当类加载器加载 DLL 时,它们存储在内存中的什么位置?
【发布时间】:2026-02-19 08:10:01
【问题描述】:

我的理解是.dllsClassLoader 加载到java.library.path,但是在从非静态过程调用System.loadLibrary()System.load() 之后它们存储在内存中的什么位置?

【问题讨论】:

    标签: java memory dll jvm classloader


    【解决方案1】:

    当调用System.loadLibrary()System.load() 函数时,当前Java 类的ClassLoader 的任务是查找请求的DLL(及其依赖项)并通知操作系统有关库的位置。 ClassLoader 本身不执行任何加载:此操作使用 Java 本地接口 (JNI) 库与操作系统通信并告诉它在哪里查找请求的库。

    当调用 DLL 函数时,该函数被加载到 Java VM 进程的 地址空间 中并在那里执行。该地址空间是操作系统为进程提供的内存块,并且与 Java VM 完全分离。因此,您的问题的答案是 Java VM 只是使用其给定的地址空间来按需加载 DLL 函数并通过 Java Native Interface 执行它们。

    来源:http://www.webbasedprogramming.com/Tricks-of-the-Java-Programming-Gurus/ch30.htm

    【讨论】:

    • 谢谢!这正是我想要的!
    • @Adil,您的知识可能有助于解决此处所述的问题:SO。这个问题与这个答案有关:加载共享库时发生内存错误。
    【解决方案2】:

    '非静态过程'与它无关。 Java 堆也没有,Java 或您的图片也没有。代码映射到进程的代码空间,数据映射到进程的数据空间。

    【讨论】:

    • 我有兴趣了解有关“流程数据空间”的更多信息。您知道加载 dll 的图片表示或图表吗?还有什么被加载到这个空间中?尺寸限制是如何规定的?
    • 操作系统中的每个进程都有代码空间和数据空间。范围太广,无法在这里回答。
    最近更新 更多