先对JVM进行一个说明。
jvm只识别字节码,所以jvm跟语言是解耦的,jvm运行的是class文件,像Groovy,Kotlin,Scala等语言,他们都可以转移成字节码,也都可以再jvm上运行,这就是JVM的跨语言的特征。
解释执行:主要是执行字节码指令,一般这些指令会按照顺序解释执行。
JIT:在运行时,虚拟机将会把这些代码编译成与本地平台相关的机器码,并进行各种层次的优化。也称为及时编译。(Just In Time Compiler)
在JDK10之前(列如jdk8)
内置了两个JIT,分别是C1编译器和C2编译器
C1:编译器是一个简单快速的编译器,不优化代码
C2:优化代码,目前无人能维护
分层编译,JDK8之后,默认开启了分层编译
逃逸分析: 实现栈上分配
分析对象动态作用域,当一个对象在方法中定义后,它可能被外部方法所引用
如果是逃逸分析出来的对象可以在栈上分配的话,那么该对象的生命周期就跟随线程了,就不需要垃圾回收。如果是频繁的调用此方法则可以得到很大的性能提高。
采用了逃逸分析后,满足逃逸的对象在栈上分配
没有开启逃逸分析,对象都在堆上分配,会频繁触发垃圾回收(垃圾回收会影响系统性能),导致代码运行慢