JVM的mixed mode

最近在做flutter相关的项目,flutter指令在执行时会报java.lang.NoClassDefFoundError: javax/xml/bind/annotation/XmlSchema 的异常,系统中使用的是jdk 14,而jdk1.8之后删除了很多jar包,因此 flutter在jdk1.8之后不能正常使用,要么去下载很多依赖包,要么把jdk 切换为jdk1.8的,而我选择了后者,因为不确定去下载很多依赖包后会不会产生异常或者需要新的依赖包的问题,选择直接下载jdk1.8安装,然后把操作系统的jdk切换为jdk1.8更方便,切换为jdk1.8也很简单,只需要把环境变量JAVA_HOME改为jdk1.8的路径即可。

jdk 1.8安装完成后且环境变量更新完成后,使用java -version确认java 8是否安装成功:

java -version

输出:

java version "1.8.0_91"
Java(TM) SE Runtime Environment (build 1.8.0_91-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.91-b15, mixed mode)

往常每次使用java -version这个命令时只注意java的版本号,但是这次注意到了第三行中的mixed mode,因为最近学习到Dart VM也是支持JIT和AOT混合模式的,于是就多关注了下JDK这里的mixed mode

其实这里的mixed mode就是指JVM的工作模式是混合模式,混合模式是JVM的默认工作模式,即JVM同时使用解释模式和编译模式。对于字节码中多次被调用的部分,JVM会将其编译成本地代码以提高执行效率;而被调用很少(甚至只有一次)的方法在解释模式下执行,从而减少编译和优化成本。JIT编译器在运行时会创建方法使用文件,然后一步一步的优化每一个方法,有时候会主动的优化应用的行为。这些优化技术,比如积极的分支预测(optimistic branch prediction),如果不先分析应用就不能有效的使用。这样将频繁调用的部分代码提取出来,编译成本地代码,也就是在应用中构建某种热点(即HotSpot,这也是HotSpot JVM名字的由来)。使用混合模式可以获得最好的执行效率。

在命令行中输入:java -X,
可以看到输出:

    -Xmixed           混合模式执行 (默认)
    -Xint             仅解释模式执行

	...

可以看到 mixed 是JVM默认的工作模式。

更多可参考:
关于JVM的类型和模式

你可能感兴趣的:(JAVA)