
帮我看看哪里出问题了 真的不会 麻烦回答的详细一点 已经提了很多次没有解决了😭
关注【相关推荐】
java虚拟机的执行引擎在执行java代码时候都有解释执行和编译执行的选择,解释执行,例如早期的java虚拟机通过字节码解释的方式运行,编译执行如当下的JIT编译,将本地某些热点代码便以为本机执行的二进制代码,提高代码的运行效率,在这里扯一下Java虚拟机两种模式,Client模式能够较快的启动,进行一些必要的优化,但是不会在后台进行深度的优化。Server模式则启动较慢,但是长时间运行性能要比Client模式高。这里其是最大的区别就在于后台编译执行的区别,Java虚拟机有三个编译的层次,第一次纯的字节码解释,在古老的java版本中使用较多,普通情况下默认c1级别的编译,解释字节码以及进行一些必要的一定程度的优化,而C2模式则会对代码进行深度的优化,比较适合于Server模式。
解释执行:
java出生的JDK1.0时代这种定义时比较准确的,当虚拟机中包含了即时编译器之后,Class文件中的代码到底会被解释执行还是编译执行这就成了虚拟机自己做选择的事情。再后来也有了直接生成本地代码的编译器,如GCJ,而C/C++也有了解释执行器的版本,如CINT,这时候笼统的说解释执行则对整个Java来说几乎成了没有意义的概念,只有确定了谈论对象是某种具体的Java实现版本和执行引擎的运行模式后,编译执行和解释执行的讨论才有意义。大部分的程序代码在物理机的目标代码或者是虚拟机能执行的指令集之前,都需要经过下图的过程:

大多数物理机或者是java虚拟机都会遵循现代经典编译原理的思路,在执行前都会对程序源码进行词法分析和语法分析,把源码抽象称为抽象的语法树。而对于c/c++而言,词法分析和语法分析以至于后面的优化器和目标代码生成器都可以选择独立与执行引擎。当然也可以把其中的一部分实现为一个半独立的编译器,这类的代表就是Java语言,又或者将这些都全部集中封装,如JavaScript执行器。对于Java而言,词法分析,语法分析然后抽象称为语法树这些工作都是在虚拟机之外进行的,二姐时期在虚拟机的内部,所以Java程序的编译就是半独立的实现。
基于栈的指令集和基于寄存器的指令集:
java基本上是一种基于栈的指令集架构,指令流中的指令大部分为零地址指令,他们依赖操作数栈进行工作。而另一种基于寄存器的指令集如上面提到的典型的X86的二地址指令集,举个1+1计算的例子看下不一样的地方:
#Java的单字节指令
iconst_1
iconst_1
iadd
istore_0
#x86的而地址指令集
mov eax, 1
add eax, 1
可以看到,java是进行出栈和入栈的操作,遇到iadd指令则计算然后将结果进行放到局部变量表的第0个slot中。而x86指令则使用mov指令将eax寄存器设置为1,然后利用add进行加法计算,然后将结果保存在eax寄存器中。基于栈的指令集优势在于有较好的可移植性,不太受到硬件的约束,编译器实现简单。而基于寄存器的指令则相比基于栈的指令中频繁的入栈出栈性能损失要小的多。相对于处理器来说,内存始终是执行速度的瓶颈。