当 JVM 执行 Java 应用程序时,操作系统的作用是什么?为什么我们需要操作系统?

2022-09-03 02:49:46

我在互联网上做了一些阅读,有些人说Java应用程序是由Java虚拟机(JVM)执行的。“执行”这个词让我有点困惑。据我所知,一个非Java应用程序(即:用C编写,C++...)可以由操作系统执行。在较低级别,这意味着操作系统将二进制程序加载到内存中,然后指示CPU在内存中执行指令。

那么现在有了JVM,会发生什么呢?据我所知,JVM(包含运行时环境)将首先由操作系统调用。从那时起,JVM 将为应用程序生成一个(或多个)线程。我想知道操作系统的作用是否还会再发挥作用?在我看来,JVM已经“绕过”了操作系统,并直接指示CPU执行应用程序。如果是这样,我们为什么需要操作系统?

更进一步,JVM将使用其JIT将应用程序的字节码编译为机器代码,然后执行这些机器代码。既然已经是机器码,我们还需要JVM吗?因为操作系统可以指示CPU执行这些机器代码,而不是JVM。我在这里犯了什么错误吗?

我想从这里的人那里学到更多。如果我错了,请纠正我。非常感谢!


答案 1

我们需要操作系统来完成C或C++程序的所有事情。默认情况下,JVM会做更多的事情,但它不会取代操作系统所做的任何事情。唯一的区别可能是,有时你有[调用][调用],或者使用编译的代码,你可以有[调用的]Your CodeJVMOSYour CodeOS

类似地,在C++中,您可能有 [调用] [调用] 。Your CodeBoostOS

当您的程序在本机代码中运行时,它不需要JVM本身。这很好,因为JVM知道何时“退后”并让应用程序运行。但是,并非所有程序都会在应用程序的剩余生命周期内编译为本机代码,因此您仍然需要它。

可以将内核旁路设备/驱动程序与 JNI 一起使用,但 Java 并不直接支持此类功能。


答案 2

在我看来,JVM已经“绕过”了操作系统,并直接指示CPU执行应用程序。如果是这样,我们为什么需要操作系统?

所有 C/C++二进制文件(不仅仅是 JVM)都直接在 CPU 上运行。运行后,这些程序可以调用操作系统提供的更多机器代码来执行有用的操作,例如读取文件,启动线程或使用网络。

JVM 将 Java 程序转换为在 CPU 上运行的指令。然而,在幕后,Java的线程,文件i / o和网络套接字(仅举几例)都包含指令,这些指令调用操作系统为线程/文件/等提供的代码。这是您仍然需要操作系统的原因之一。

既然已经是机器码,我们还需要JVM吗?

JVM 提供了您无法从 JIT 编译器获得的功能。归根结底,JVM只是运行了大量的机器代码,但并非所有的机器代码都来自JIT(或解释器)。例如,其中一些机器代码会执行垃圾回收。这就是您需要 JVM 的原因。


推荐