谈谈你对 Java 平台的理解?“Java 是解释执行”,这句话正确吗?

295 阅读3分钟

谈谈你对 Java 平台的理解?“Java 是解释执行”,这句话正确吗?

问题回答:

Java的显著的特点:

  1. write once,run anywhere;

因为有jvm这样的东西,所以能保证Java代码,一次编写,哪里都能运行

  1. garbage collection
  2. 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平台知识蓝图

image

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的使用 可以看这篇文章