JAVA-JVM调优

一、JVM调优介绍之JTI编译器

  JTI编译器(just in time)

开发语言可以以编译方式来划定为编译型语言,解释型语言,分层编译型语言(包含解析和编译共存)

先来了解下计算机如何读取代码程序,由于计算机的CPU只能执行相对少而特定的命令,而这种命令的形式就是汇编码或者二进制码。因此CPU所执行的程序都要翻译成这种指令,CPU才可以识别 并且运行。

不同产商的CPU对应可以识别的指令集也不太一样,但是新版本的CPU通常是能够兼容老版本CPU的指令集的,但是反过来,老版本的CPU是没办法兼容新版本的CPU指令集的。

而编译型语言就是利用编译器静态产生相对应CPU能识别的二进制文件,如果有什么机器能带有CPU的指令集的话 也可以识别这些编译后的二进制文件。也就是能运营对应的程序了。

至于还有一种解释型语言,这些语言的读取不需要依赖CPU去读取特定的二进制文件,而是依赖语言对应的解释器,当程序运行时,解释器会将对应的代码转换成特定的二进制码。

它与编译型语言的区别在于:编译型语言是预编译,即程序在启动之前就把代码转换成CPU能识别的二进制文件了。但是解释型语言是在程序运行的时候通过解释器将代码逐一转换成二进制语言供CPU读取。

这样2种机制就产生了对应的优缺点:编译型语言因为在程序启动之初就将代码转换成了二进制文件,所以运行程序相对较快。缺点也很明显,可移植性比较差,如果CPU无法识别对应的二进制指令就无法运行程序。

相比于编译型的程序,解释型程序依赖解释器启动,所以凡是装有解释器的计算机都可以运行对应的程序,因为由解释器将代码转换为CPU可识别的二进制文件,但是由于是运行后边运行边转换 所以程序的运行速度肯定就没有编译型程序那么快。

举个例子:一个循环代码,编译型只需要编译一次就可以一直执行这段代码,但是解释型语言就需要在每次循环体中反复的去解析代码,将它转换成二进制码。

 

编译型语言:如C++,Fortran。 解释型语言:如PHP,Perl。

而JAVA则是二者的结合,JAVA应用会被编译,但是不是编译成CPU的二进制码,而是编译成JAVA平台自己可以识别的二进制码,而这个编译是在程序执行是进行的,所以java的编译也称为"即时编译(JIT)"

 

(1).JIT之热点编译

  上述说到java由于是在程序执行时编译,所以java虚拟机的核心编译器是即时编译器。

  热点编译(HotSpot):HotSpot来自于它看待代码编译的方式,当一个程序只有一部分代码经常被执行,并且程序的性能取决于执行的这些代码有对快。那么这些代码就被称为该程序的热点。

  JVM在执行代码时其实并不会去编译代码。

  原因:

    (1)如果执行的代码只是执行一次,那么解释该代码的速度就会比编译后再执行的速度更快。

      (2)是为了优化代码,如果JVM执行的特定的代码次数越多,虚拟机就会越了解这段代码,这使得JVM在编译代码时可以做出对这段特定代码的优化。举个例子:b = obj1.equals(obj2),这段代码在一开始执行时为了需要知道obj1是什么类型,在执行equals方法之前会去找obj1的类型,然后再执行equals方法,但是随着这段代码的执行次数增加,JVM知道了obj1就是String类型,那么在编译后就会变成b=String.equals(obj2),减少了一次类型确认的步骤。

 

(2).选择编译器类型(client,server,分层编译(即同时使用))

  client与server两种编译器的区别在于:编译代码的时机不同,client开启编译要早于server。也就意味着,在代码执行的开始阶段,client比server要快,因为它的编译代码相比于server而言要多。它们2者的选择根据需求而定,如果比较在意启动时的时间,那么一般会选择client。但目前大都数都是使用分层编译,它的启动性能非常的接近client,又能包含后期得代码热点优化。而且在JDK1.8后JVM默认的编译类型就是分层编译。

 

posted @ 2019-07-01 15:12  粗鲁师太  阅读(1586)  评论(0编辑  收藏  举报