Java代码在虚拟机中运行
语法复杂,抽象程度高,直接在硬件上运行程序不现实。需要在执行前做一个转换。
转换的思路: 设计一个面向对象的语言的虚拟机,通过编译器将Java程序转换为虚拟机识别的指令序列。
Java的指令的操作码是一个字节。
虚拟机是用软件实现,那么可以让程序实现不同平台上的虚拟机上实现程序。一次编写,到处运行。
带来一个托管环境,能帮助处理一些代码中存在的问题。包含内存管理与垃圾回收。还提供了数组越界动态类型安全权限等动态检测。
Java虚拟机是怎样运行Java的字节码的
虚拟机 将Java代码百年已成class文件加载到Java内存中,Java类会被放在方法区中。虚拟机执行的是方法区的代码
调用一个Java方法,虚拟机会在当前线程的方法栈中形成一个栈帧,存放字节局部白能量以及字节码的操作数。不需要使用连续内存进行存储。
虚拟机将字节码翻译成机器码。
在HotSpot中两种形式。
解释性:逐条的将字节码翻译成机器码并执行。
即时编译:一个方法中包含的所有字节编译成机器码之后执行。
后者比前者优势在于运行速度快。
HotSpot采用的是混合模式。先解释执行字节码,而后对反复执行的热点代码以及方法进行即时编译。
Java虚拟机效率
大部分不常用的代码采取解释执行的方式运行。热点代码采用编译成机器码达到理想的运行速度。
Java7开始HotSpot采用分层的编译方式,热点代码首先使用C1编译,然后热点代码在进一步被C2编译。。
即时编译是放在额外的编译线程中执行的。根据CPU的数量设置编译线程的数目。1:2的比例分配给C1以及C2。
C1与C2是java中提供的即时编译器。
计算机资源充足的情况下,活解释执行与编译执行同时进行,编译完成后的机器码会在下次调用时候启用,代替解释执行。