JVM 是否使用系统调用来寻找操作系统功能?

web*_*dev 2 java jvm

我们知道 JVM 调用底层系统来分配内存和 CPU 时间、访问文件等等。它如何在内部工作以实现其活动?

JVM 是否使用系统调用?

Jur*_*nka 6

事实上,JVM 需要利用系统调用,这是一种允许进程与底层系统资源交互的操作系统方式。

即使在这个非常有限的 java/jvm 运行期间,您也可以运行strace java -version来查看执行的一堆系统调用(mmapmprotectopenat等)。

了解更多信息的另一个好方法是挖掘 JVM 源代码以获取本机方法。一个例子是FileChannel#force 方法的实现, 该方法内部调用fsync系统调用(例如):https://github.com/AdoptOpenJDK/openjdk-jdk11u/blob/5f01925b80ed851b133ee26fbcb07026ac04149e/src/java.base/unix/native/libnio /ch/FileDispatcherImpl.c#L172


Ste*_*n C 6

JVM 是否使用系统调用?

是的。

它如何在内部工作以实现其活动?

典型的模式是 Java 类中的某些方法被标记为native. 当 JVM 遇到对native方法的调用时,它会调用 C 或 C++ 代码,这些代码是 JVM 可执行文件的一部分。本机方法实现通常执行以下操作:

  1. 检查来自 Java 的参数,并将它们转换为 C/C++ 兼容形式。例如,String参数需要转换为以零结尾的形式。

  2. 使用它需要的参数调用标准 C/C++ 库函数。

  3. 库函数进行系统调用。

  4. 操作系统完成它的工作,系统调用返回。

  5. 标准 C/C++ 库函数返回。

  6. 本机方法实现检查'errno'。如果有错误,它会创建一个 Java 异常对象并抛出它。

  7. 否则,本机方法实现将结果等转换为 Java 对象并将它们返回给 Java 方法的调用者。

细节会有所不同,具体取决于本机方法的作用。

如果您想更深入地了解,我建议您查看 OpenJDK 源代码树的副本并开始搜索。(你需要自己做硬码......)