一、为什么java要在java虚拟机中运行?

  1. 可以实现一次编译,到处运行的功能。
  2. 提供了托管环境,包括自动内存管理以及垃圾回收
  3. 提供数组越界、动态类型、安全权限等等的动态检测

二、java虚拟机是怎样运行字节码的

  1. 从虚拟机的角度执行java代码首先需要将它编译而成的class文件加载到java虚拟机中。加载后的java类会被存放到方法去。实际运行时,虚拟机会执行方法去内的代码
  2. 运行过程中,每当调用一个java方法,java虚拟机会在当前线程的java方法栈中生成一个栈帧,用以存放局部变量以及字节码的操作数。这个栈帧的大小是提前计算好的,而且java虚拟机不要求栈帧在内存空间里连续分布。
  3. 当退出当前方法时,不管是正常返回还会异常返回,java虚拟机均会弹出当前线程的当前栈帧,并将之舍弃。
  4. 在HotSpot里面,上述翻译过程有两种形式:第一种是解释执行,即逐条将字节码翻译成机器码并执行;第二种是即时编译(Just-In-Time complication,JIT)即将一个方法中包含的所有字节码编译成机器码后再执行。
  5. 前者的优势在于无需等待编译,后者的优势在于实际运行速度更快。HotSpot默认采用混合模式,综合了解释执行和即时编译两者的优点。它会先解释执行自己码,而后将其中反复执行的热点代码,以方法为单位进行即时编译。
    jvm常见问题

三、java虚拟机的运行效率是怎样的

  1. 即时编译建立在程序符合二八定律的假设上,也就是百分之二十的代码占据了百分之八十的计算性能。
  2. 对于占据大部分的不常用的代码,我们无需耗费时间将其编译成机器码,而是财局解释执行的方式运行;另一方面,对于仅占据小部分的热点代码,我们则可以将其编译成机器码,以达到理想的运行速度。
  3. 理论上讲,即时编译后的java程序的执行效率,是可能超过C++的。这是因为与静态编译相比,即时编译拥有程序的运行时信息,并且能根据这个信息作出相应的优化。
  4. 在计算资源充足的情况下,字节码的解释执行和即时编译可同时进行,编译完成后的机器码会在下次调用该方法时启用,以替换原本的解释执行。

相关文章:

  • 2022-01-18
  • 2021-11-18
  • 2021-10-23
  • 2022-03-14
  • 2021-06-19
  • 2021-12-04
猜你喜欢
  • 2022-01-22
  • 2021-10-30
  • 2021-10-30
  • 2021-11-03
  • 2021-06-14
相关资源
相似解决方案