我在互联网上做了一些阅读,有人说Java应用程序是由java虚拟机(JVM)执行的。 “执行”这个词让我感到困惑。据我所知,操作系统可以执行非Java应用程序(即:用C,C ++编写)。在较低级别,这意味着OS将二进制程序加载到内存中,然后指示CPU执行内存中的指令。
那么现在有了JVM,会发生什么?据我所知,操作系统首先会调用JVM(包含运行时环境)。从那时起,JVM将为应用程序生成一个(或多个)线程。我想知道操作系统的角色是否会再次发挥作用?在我看来,JVM已“绕过”操作系统并直接指示CPU执行应用程序。如果是这样,为什么我们需要操作系统?
再稍微一点,JVM将使用其JIT将应用程序的字节代码编译为机器代码,然后执行这些机器代码。由于它已经是机器码,我们是否还需要JVM?因为操作系统可以指示CPU执行这些机器代码,而不是JVM。我在这里犯了什么错吗?
我想向这里的人们学习更多。如果我错了,请纠正我。非常感谢!
我们需要操作系统来完成C或C ++程序的所有功能。默认情况下,JVM会执行更多操作,但它不会替换操作系统所做的任何操作。唯一的区别可能是有时你有Your Code
[调用] JVM
[调用] OS
,或者用编译后的代码你可以有Your Code
[调用] OS
同样在C ++中你可能有Your Code
[调用] Boost
[调用] OS
。
当您的程序在本机代码中运行时,它不需要JVM。这很好,因为JVM知道何时“退回”并让应用程序运行。但是,并非所有程序都将在应用程序的剩余生命周期内编译为本机代码,因此您仍然需要它。
它可以使用内核旁路设备/驱动程序与JNI,但Java不直接支持这种功能。
在我看来,JVM已“绕过”操作系统并直接指示CPU执行应用程序。如果是这样,为什么我们需要操作系统?
所有C / C ++二进制文件(不仅仅是JVM)都直接在CPU上运行。一旦运行,这些程序可以调用操作系统提供的更多机器代码来执行有用的操作,例如读取文件,启动线程或使用网络。
JVM将Java程序转换为在CPU上运行的指令。但是,在幕后,Java的线程,文件i / o和网络套接字(仅举几例)都包含调用操作系统为线程/文件/等提供的代码的指令。这是您仍然需要操作系统的原因之一。
由于它已经是机器码,我们是否还需要JVM?
JVM提供了您无法从JIT编译器获得的功能。在一天结束时,JVM只运行了大量的机器代码,但并非所有的机器代码都来自JIT(或来自解释器)。例如,某些机器代码执行垃圾收集。这就是你需要JVM的原因。
底层的基础O / S仍然需要为JVM做几乎所有事情,尤其是:
还有很多!
好吧,我想保持这个简单。您是如何使用ZX Spectrum进行编码的,那就是过去,当您真的不使用操作系统时(甚至在DOS时代之前,在PC之前的时代)。你编写代码,你必须管理所有代码。在许多情况下,没有编译器,因此您的程序被解释。
接下来,人们意识到操作系统很棒,程序变得更简单。此外,编译器的使用范围更广。我正在谈论C ++。在这些程序中,如果您需要调用某些操作系统功能,则需要添加所需的库并拨打电话。现在,你的程序依赖于操作系统,另一个问题是你的程序包含一些固定版本的操作系统DLL。如果同一站上的另一个程序需要不同版本的DLL你遇到麻烦。
在JVM历史的早期没有JIT编译器在哪里使用。因此,您的程序以解释模式运行。您的应用程序不再需要直接调用操作系统,而是根据需要使用JVM。相反,JVM将一些应用程序调用重定向到操作系统。将JVM视为中介。 JVM的最佳功能之一,它具有普遍性。你不需要坚持特定的操作系统(实际上你需要做一些小的调整,当你的程序“偶尔”在一些特定的操作系统中工作时,你不遵守Java要求,例如你使用C: \对于Thread调度程序上的文件或假设,在当前操作系统上恰好是真的,但通常不保证JVM是真的)。 JVM的程序员开发这样的API,一方面可以很容易地为Java开发人员使用,另一方面可以映射到任何OS系统调用。
JVM为操作系统提供了更多简单的包装器。它有自己的内存模型(线程同步),例如,它有一些周受助者(它在JDK 1.5中完全修改,因为它被破坏了)。它还有垃圾收集,它将变量初始化为空值(int i
;我将初始化为0)。那就是JVM除了作为OS的主持人之外还充当了你自己的应用程序的帮助代码。
在某些时候,JIT被添加了。添加它是为了减少JVM创建的开销。当某些假设成立时,通常在执行一次代码之后,可以将命令解释编译为机器代码(我跳过字节代码的相位)。这是优化,我不知道你可以影响的任何情况。
在JDK 1.6中添加了另一个优化。现在,某些情况下的某些对象可以在堆栈中分配,而不是在堆上分配。我不知道,它可能有一些副作用,但它是JVM可以为您做的一个例子。
我的最后一句话。当您编译代码时,实际发生了什么,检查程序在语法上是否正确,然后生成字节代码(.class文件)。 Java语言使用现有字节代码的子集(这是AOP的实现方式,使用现有的字节代码,而不是Java语言的一部分)。执行java程序时,会解释这些字节代码,它们会即时转换为机器指令。如果JIT打开,则可以将某些执行行编译为机器语言并重新使用而不是动态解释。
由于它已经是机器码,我们是否还需要JVM?编译的java程序不是机器码。 [javac]将[.java]文件编译成字节码[.class]文件。然后将这些字节码提供给JRE [Java运行环境]。现在,java解释器实现了将字节码解释为在CPU上运行的本机机器代码。
我们知道OS不执行任何程序它为处理器提供环境执行如果我们谈论环境它分配内存加载文件给处理器指令,管理地址 处理器的加载数据方法工作只是执行程序这个东西发生在c或任何程序编程语言中如果我们看到的话比OS在OS的这个开销中扮演一个非常重要的角色因为如果我们在c中写一个小的简单程序就像Hello World其中只包含一个Main函数,编译时会生成多个函数的.exe文件,这是从Library函数中取出来的,所以用OS管理所有东西都是繁琐的工作所以在JVM中给了Relief OS这里OS的工作只是为了将JVM从硬盘加载到RAM并使jvm执行并为JVM分配空间以执行java程序此处Momery分配,从硬盘加载字节代码文件,地址管理,内存分配和取消分配由JVM本身完成操作系统是免费的,它可以做其他工作.jvm分配或释放内存基于操作系统执行java程序的内容。
如果我们谈论执行JVM包含解释器以及JIT编译器,在执行该方法之后将字节代码转换为必需函数的机器代码该方法的可执行代码被破坏,这就是为什么我们可以说java确实有.EXE文件