JIT 知识总结
作者:互联网
编译型与解释型语言
-
编译型语言
程序以编译后的二进制汇编交付,汇编码针对于特定CPU。
优点:- 编译器有足够程序的信息对代码进行优化,运行速度快。
缺点: - 平台相关,需要兼容CPU所用的指令集。
- 编译器有足够程序的信息对代码进行优化,运行速度快。
-
解释型语言
只要机器上有适合的解释器,就可以运行。
优点:- 平台无关,只要有解释器,就可以运行。
缺点: - 运行速度慢
- 平台无关,只要有解释器,就可以运行。
-
关于JAVA
JAVA应用会被编译,但是并非编译成特定CPU专用的二进制代码,而是另一种字节码--JAVA字节码。这种代码能够用java运行(像解释器一样)。
所以JAVA变成了一种独立于平台的解释型语言。
又因为它是理想化的二进制代码,所以执行时也会被编译成平台特定的二进制代码--->编译在程序执行时进行,所以有了JIT(Just In Time Compiler)JAVA文件被编译成中间语言--->JAVA字节码。运行时,被JVM进一步编译成汇编语言。在字节码--->汇编的过程中,会有大量的优化,改善程序的性能。
以上也是JAVA被叫做“半编译半解释型语言”的原因。
热点编译
- 对于执行很少次数的语言,代码会解释执行。
- 如果是经常被调用或者运行很多次的循环的代码,在字节码编译成汇编的过程中,会有大量的优化,改善性能。
编译器类型
- Client 编译器(C1)
启动运行快,但是代码优化少。 - Server 编译器(C2)
需要更多的时间进行代码的编译,优化代码。热身结束后,应用运行快。 - 分层编译(C1 C2混合)
代码先由C1编译运行,随着代码变热,由C2重新编译。
JAVA 8 中,分层编译是默认开启的。-XX:+TieredCompilation
分层编译的启动时间很接近C1的启动时间。
一般在选择编译方式的时候,都会选择分层编译。
如果任务量是固定的,就需要测试三种编译器编译应用的运行速度,选择优势最大的。
java version "17.0.2" 2022-01-18 LTS
Java(TM) SE Runtime Environment (build 17.0.2+8-LTS-86)
Java HotSpot(TM) 64-Bit Server VM (build 17.0.2+8-LTS-86, mixed mode, sharing)
在查看JAVA版本时,mixed mode,指的就是解释执行和编译执行搭配使用。
编译器调优
- 编译线程
根据CPU的数量不同,JVM会开启不同数量的C1,C2线程。 - 方法内联。
默认开启。-XX:+Inline.
对性能影响很大,一般不要关闭。 - 逃逸分析
最复杂的优化方法。
默认开启。-XX:+DoEscapeAnalysis
开启逃逸分析后,能够获得以下优化:- 栈上分配
对象的分配从堆的分配变为栈上分配,这样能够避免GC。
因为随着栈帧的消亡,对象也就不存在了。 - 同步省略(锁消除)
如果对象只会被一个线程访问,就可以不考虑同步的事情。 - 对象分离(标量替换)
如果对象能够不需要作为一个连续的内存结构被访问,并且不需要被外部访问,那么它可以不存储在内存中,可以存储在寄存器上。
- 栈上分配
标签:总结,JAVA,代码,知识,编译器,编译,JIT,编译成,运行 来源: https://www.cnblogs.com/reclusiveone/p/16065512.html