Sorry, your browser cannot access this site
This page requires browser support (enable) JavaScript
Learn more >

魔数

常量值 比如说用来标识文件类型

JIT

​ JIT(Just in time compiler).

​ 前提:

​ 1. java文件是先被编译成字节码(也就是class文件)然后才载入JVM的
​ 2. JVM中既有解释器又有编译器

​ 及时编译技术就是说,在JVM解释(用的是解释器)执行字节码的时候,遇到一些热点代码(也就是经常被重复执行的代码,具体怎么算重复执行后面有讲到)时,会把它编译成和本地平台相关的机器码去执行。

​ 这里你可能会有疑问:

  1. 为什么遇到热点代码时要把他们翻译成本地机器码?

    答:因为JVM执行机器码的速度要比解释执行快得多,遇见这种重复执行很多次的代码,把它翻译成机器码是明智的。

  2. 为什么不全部编译?

    答:因为编译也费时间啊,尤其当工程很大的时候。而且,如果我们在执行前把Java文件全部编译成机器码的话,那它还和C++有什么区别,它的跨平台性又体现在哪里?

​ java文件首先被编译成字节码,也就是class文件,class文件被虚拟机装载以后,会以解释模式运行一段时间,当发觉某些代码运行比较频繁(这里有两种度量方式)时,就会对这些代码进行优化。

This is a picture without description

从上图可以看出,JVM中有解释器和编译器,解释器将字节码解释执行,比较慢。尤其当有一部分代码运行的特别频繁,如循环,这时候使用解释器来解释执行就更慢了。而JIT的作用也就体现在这里。代码解释执行的时候,它先暗中观察一段时间,从而发现热点代码“Hot Spot Code”,把它编译成和本地平台相关的机器码(编译由后台线程去执行),并进行各个层次的优化。这里的热点代码有两类:

  • 多次调用的方法

  • 多次调用的循环体

    那么如何发现热点代码呢,这就需要用到热点探测“Hotpot Detection”,目测的探测方法有两种:

  • 基于采样的热点探测:周期性的检查每个线程的栈顶,那些经常出现在栈顶的方法就是热点代码。

    优点:容易获得方法调用关系

    缺点:不精确

  • 基于计数器的热点探测:更为严谨,它为每个方法或者代码块建立计数器,如果计数超过某个阈值,那么这个方法(代码块)就是热点代码。

    优点:精确

    缺点:比较麻烦,需要为每个方法或代码块建立计数器

HotSpot中使用第二种,它为方法和循环体分别设定了方法计数器和回边计数器。

This is a picture without description

那么问题来了,编译后的本地机器码放在了哪里?

JIT编译器分client模式和server模式。server模式启动慢,但是启动后性能高,适合于大型的服务器后台程序;client启动快,但性能不如server模式,适合于桌面程序等。

评论