事实上,JVM 需要利用系统调用,这是一种允许进程与底层系统资源交互的操作系统方式。
即使在这个非常有限的 java/jvm 运行期间,您也可以运行strace java -version来查看执行的一堆系统调用(mmap、mprotect、openat等)。
了解更多信息的另一个好方法是挖掘 JVM 源代码以获取本机方法。一个例子是FileChannel#force 方法的实现,
该方法内部调用fsync系统调用(例如):https://github.com/AdoptOpenJDK/openjdk-jdk11u/blob/5f01925b80ed851b133ee26fbcb07026ac04149e/src/java.base/unix/native/libnio /ch/FileDispatcherImpl.c#L172
JVM 是否使用系统调用?
是的。
它如何在内部工作以实现其活动?
典型的模式是 Java 类中的某些方法被标记为native. 当 JVM 遇到对native方法的调用时,它会调用 C 或 C++ 代码,这些代码是 JVM 可执行文件的一部分。本机方法实现通常执行以下操作:
检查来自 Java 的参数,并将它们转换为 C/C++ 兼容形式。例如,String参数需要转换为以零结尾的形式。
使用它需要的参数调用标准 C/C++ 库函数。
库函数进行系统调用。
操作系统完成它的工作,系统调用返回。
标准 C/C++ 库函数返回。
本机方法实现检查'errno'。如果有错误,它会创建一个 Java 异常对象并抛出它。
否则,本机方法实现将结果等转换为 Java 对象并将它们返回给 Java 方法的调用者。
细节会有所不同,具体取决于本机方法的作用。
如果您想更深入地了解,我建议您查看 OpenJDK 源代码树的副本并开始搜索。(你需要自己做硬码......)
| 归档时间: |
|
| 查看次数: |
895 次 |
| 最近记录: |