问题一:Java与C++区别
1.Java需要运行时环境,包括Java虚拟机以及Java核心类库等。
2.C++无需额外的运行时,通常编译后的代码可以让机器直接读取,即机器码
问题一:Java为什么要在虚拟机运行?
1.一次编译,到处运行。
这里涉及到一个概念:字节码。
Java字节码指的是设计一个面向Java特性的虚拟机,通过编译器将Java程序转换成该虚拟机所能识别的指令序列。
为什么是叫字节码呢?原因还是Java 字节码指令的操作码(opcode)被固定为一个字节。
2.托管环境。
虚拟机能够代替我们处理一些代码中冗长而且容易出错的代码的部分,比如C++中经常出现的垃圾回收问题,程序员经常忘记回收垃圾。
另外,虚拟机还为我们提供了如数组越界,动态类型等动态检测,极大地降低了Java开发的难度。
问题二:Java虚拟机具体是如何运行Java字节码的?
以Hotspot虚拟机为例子,Java虚拟机细分为方法区、堆、Java方法栈、面向本地方法的本地方法栈、PC寄存器
从虚拟机的视角看,
1.执行Java代码首先需要将它编译成class文件加载到Java虚拟机中,加载后的Java类会被保存到方法区中。实际运行时,虚拟机会执行方法区中的代码。
2.上图中的堆和栈是用来存储运行时数据的。其中,栈被分成了面向Java方法的Java方法栈和面向本地方法(C++写的native方法)本地方法栈,以及存放各个线程执行位置的PC寄存器
3.在运行过程中,每当调用一个方法,虚拟机就会在当前线程的Java方法栈中生成一个栈帧,用以存放局部变量以及字节码的操作数。当方法执行完毕之后,该栈帧也随着被弹出。
从硬件角度看,
在HotSpot里面,编译Java代码有两种方式,一种是解释执行,另一种是编译执行。
解释执行:逐条将字节码翻译成机器码并执行(边翻译边读)
编译执行:将一个方法中包含的所有字节码编译成机器码之后执行。(翻译完之后,再读)
前者优势在于:无需等待编译完全
后者优势在于:热点代码比较多的时候,读取的执行效率快于前者。
HotSpot使用的是多个即时编译器共同协作:C1,C2,和Java10正式使用的Graal。