为什么Java要在虚拟机里运行
JRE:Java的运行时环境。
JRE仅包含运行Java程序的必须组件,包括Java虚拟机以及Java核心类库等。
Java虚拟机是将Java代码转换为字节码。
Java虚拟机可以有硬件实现,也可以用软件实现。使用软件实现的好处,一旦一个程序被转换为Java字节码,那么它便可以在不同平台上的虚拟机实现里运行。
虚拟机的另外一个好处:托管环境,自动内存管理与垃圾回收。
Java虚拟机具体是怎样运行Java字节码
虚拟机
从虚拟机的角度来看,执行Java代码首先需要将它编译而成的class文件加载到java虚拟机中。
加载后的Java类会被存放于方法区。实际运行时,虚拟机会执行方法区内的代码。
Java虚拟机在内存中划分出堆和栈来存储运行时数据。Java虚拟机会将栈细分为面向Java方法的Java方法栈(存放局部变量以及字节码的操作数)、
面向本地方法栈、以及存放各个线程执行位置的PC寄存器。
从硬件角度来看,Java虚拟机需要将字节码翻译成机器码。
解释执行:即逐条将字节码翻译成机器码并执行(无需等待编译)。即时编译:即将一个方法中包含的所有字节码编译成机器码后在执行(实际运行速度更快)。
HotSpot默认采用混合模式,先解释执行字节码,而后将其中反复执行的热点代码,以方法为单位进行即时编译。
Java虚拟机的运行效率是怎么样的
HotSpot提供了C1、C2和Graal(Java10)编译器。
C1又叫做Client编译器,面向的是对启动性能有要求的客户端GUI程序,采用的优化手段相对简单,因此编译时间较短。
C2又叫做Server编译器,面向的是对峰值性能又要求的服务端程序,采用的优化手段相对复杂,因此编译时间较长。
从Java7开始,HotSpot默认采用分层编译的方式:热点方法会先被C1编译,而后热点方法中的热点会进一步被C2编译。
HotSpot的即时编译是放在额外的编译线程中进行的。HotSpot会根据CPU的数量设置编译线程的数目,并且按1:2的比例
配置为C1和C2编译器。
Java虚拟机会将boolean类型看作是int类型。true就是1,false是0。
类型 | 值域 | 默认值 | 虚拟机内部符号 |
---|---|---|---|
boolean | {false,true} | false | Z |
byte | [-128,127] | 0 | B |
short | [-32768,32767] | 0 | S |
char | [0,65535] | '\u0000' | C |
int | [-231,231-1] | 0 | I |
long | [-263,263-1] | 0L | J |
float | ~[-3.4E38,3.4E38] | +0.0F | F |
double | ~[1.8E308,1.8E308] | +0.0D | D |
不管何种类型,拥有不同的值域,但默认值在内存中均为0。
声明为byte、char以及short的局部变量,是可以存储超过它们取值范围的数值,在存储的时候,Java虚拟机会进行掩码操作。
在读取时,Java虚拟机则会将其扩展为int类型。
将boolean保存在静态域中,制定了其类型为'Z',当修改为2时取低位最后一位为0,当修改为3时取低位最后一位为1。
说明boolean的掩码处理是取低位的最后一位。
网友评论