谈谈你对 Java 平台的理解?“Java 是解释执行”,这句话正确吗?
问题回答:
Java的显著的特点:
- write once,run anywhere;
因为有jvm这样的东西,所以能保证Java代码,一次编写,哪里都能运行
- garbage collection
- Java还有jdk,jre,jvm这些东西,具体特点看这个:Java技术体系模块
java代码的执行情况:
这里的JVM实际上指的是JVM内嵌的解释器
这里的Java编译器主要作用就是把.java文件转成.class文件,常用的java编译器有:
- javac编译器,Java技术体系模块中说明了这是jdk中的,也就是说只有JRE的话不能编译.Java文件
- ECJ这是Eclipse自己写的具有java编译规范的Java编译器,这也是只有JRE在Eclipse中也能运行的原因
- ......
因为有JIT编译器,所以Java不是存粹的解释执行
常见的JVM都提供了JIT(JUST-IN-TIME)编译器
JIT编译器也就是动态编译器,JIT能在运行时将热点代码编译成机器码
考点分析:
考察点:基础知识理解;Java平台模块;运行原理
知识扩展
对平台理解可以谈:Java 语言特性,包括泛型、Lambda,异常处理,垃圾回收,反射 等语言特性; 基础类库,包括集合、IO/NIO、网络、并发、安全等基础类库
也可以谈JVM的一些基础概念和机制:
- 比如Java类加载机制,常用版本内嵌的class loader,例如Bootstrap、Extension和Application class loader;
- 类加载大致过程:
加载-->验证-->链接-->初始化
- 垃圾收集的基本原理,最常见的垃圾收集器,如SerialGC、Parallel GC、 CMS、 G1等
java平台知识蓝图

JVM编译相关内容
在运行时,JVM 会通过类加载器(Class-Loader)加载字节码,解释或者编译执行:
JDK8是一种混合模式(-Xmixed)
- server模式上运行的JVM会进行上万次调用,收集足够信息进行高效编译;
- client模式的上限是1500次
Hotspot内置了两种不同的JIT Compiler,C1和C2
- C1对应了client模式,适用于对启动速度敏感的应用;
- C2对应了server模式,它的优化是为了长时间运行的服务器端应用设计的;
- 默认是采用分层编译(TieredCompilation)
Java 虚拟机启动时,可以指定不同的参数对运行模式进行选择
- 指定“-Xint”:只进行解释执行,不对代码进行编译,这种方式抛弃了JIT可能带来的优化;
- 指定“Xcomp”:告诉JVM关闭解释器,不进行解释执行
“-Xcomp”会导致 JVM 启动变慢非常多,同时有些 JIT 编译器优化方式,比如分支预测,如果不进行 profiling,往往并不能进行有效优化
AOT(Ahead-of-Time Compilation)提前编译
- 直接将字节码编译成机器代码,避免了 JIT 预热等各方面的开销
- Oracle JDK 9 就引入了实验性的 AOT 特性,并且增加了新的 jaotc 工具
- 利用下面的命令把某个类或者某个模块编译成为 AOT 库:
jaotc --output libHelloWorld.so HelloWorld.class
jaotc --output libjava.base.so --module java.base
然后启动时指定
java -XX:AOTLibrary=./libHello.so,./libjava.base.so HelloWorld
- Oracle JDK 支持分层编译和AOT协作使用,这两者并不是二选一的关系 关于AOT的使用 可以看这篇文章