Java字节码的前世今生

1.Java语言的跨平台特性

首先Java语言的跨平台特性与JVM(Java虚拟机)密不可分。我们平时会接触到的JRE(Java Runtime Environment)、JDK(Java Development Kit)。JRE包含了JVM(Java虚拟机)和类库,而JDK相当于JRE的一个拓展,提供了Javac(编译器)以及各种诊断工具等,如下图所示。那么跨平台性是怎样通过虚拟机来实现的呢?我们首先来说一下程序从源代码到运行的几个阶段:编码->编译->运行->调试。Java在编译阶段则体现了跨平台的特性,编译的大致过程如下:首先通过编译器将Java源代码编译成.class结尾的字节码,只要某个平台安装了JVM操作系统,字节码就可以在任意的平台执行。JVM在拿到字节码后会进行第二次编译,将字节码转为当前机器的机器代码。Java语言的跨平台特性并不是指Java语言本身具有跨平台的特性,而是指JVM使Java语言的跨平台成为了可能。
在这里插入图片描述

2.Java字节码

Java源代码(xxx.java文件)经过Java的前端编译器(javac)编译成为字节码(xxx.class文件)后,通过JVM的类加载子系统加载到JVM的运行时数据区后,通过JVM执行引擎对所加载的文件进行处理。
在执行引擎中,包含了两类编译器,即为传统解释器JIT(just in time)即时编译器。我们可通过设置JVM来改变这两种编译器的使用占比。
传统后端解释器:这种编译器对于加载进运行时数据区的文件中的指令是一行一行执行的,也就是将当前指针所在的行的字节码指令翻译成为机器码指令,然后执行。指针再切换到下一行,然后再对下一行的字节码指令进行翻译。这里所说的指针为JVM中每个线程都会有的结构叫程序计数器 他用来记录当前执行指令所在位置,以便于线程上下文切换时,能够记录当前翻译的行数,待下一次分配到CPU运行时间片时能够继续往下翻译。
即时编译器:这种编译器启动较慢,但是后期确实非常快,这里就要引入一个概念叫热点代码,热点代码就是使用频率比较高的一些代码,JIT会在程序运行中捕捉这些代码,并将这些代码直接编译成机器指令,然后缓存起来,这样下次碰到相同的字节码指令时就可以直接从缓存中拿出这些机器指令进行执行。启动较慢也是因为刚开并不知道哪些代码会频繁出现,只有依靠传统解释器解释的过程中才会慢慢识别出热点代码。
二者的关系类似于赛车与战斗机进行比赛,一声号令,我们会首先看见赛车飞驰而出,把战斗机远远的甩在了后边,但是没过多久,我们就看见战斗机以赛车几倍的速度超了过去,并且与赛车的距离越拉越大。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值