第1讲 谈谈对JAVA平台的理解
先引入一个问题,Java是解释执行,对吗?
典型回答
JAVA本身是一种面向对象的语言,它最显著的特点有两个,即“一次书写,到处运行”,跨平台能力很强;另外一个是垃圾收集,JAVA通过垃圾收集器回收内存,在JVM中的堆空间进行回收。
Java是解释执行这句话其实不准确。一个.java文件首先通过javac编译成字节码文件.class,然后通过JVM内置的解释器将字节码转换成最终的机器码。不过JVM也会提供即时编译器,这种情况下的热点代码属于编译执行了。
知识拓展
对JAVA平台的理解,可以从很多方面简明扼要的谈一下,比如
- JAVA的语言特性,封装、继承、多态,泛型、Lambda等;
- 基础类库,集合、IO/NIO、并发、安全等;
- JVM的基础概念,类加载机制、类加载大致过程(加载、验证、链接、初始化、);
- 垃圾回收的算法,常见垃圾回收器CMS,G1等,适合什么情况。
深入探讨
Java的执行一般分为编译和运行,.java文件经过javac的编译生成字节码文件.class。之后通过字节码和JVM进行跨平台的抽象,屏蔽了操作系统和硬件的细节,是实现“一次编译,到处执行”的基础。
运行时,JVM通过类加载器(Class-Loader)加载字节码,解释或者编译执行。JDK8实际上就是解释和编译混合的模式。JVM内置了两个不同的JIT compiler:
- C1对应client模式,适用启动速度敏感的应用,如普通Java桌面应用。
- C2对应sever模式,为长时间运行的服务端应用设计。
Java虚拟机启动时,可以指定不同的参数对运行模式进行选择,如指定“-Xint”,告诉JVM只需要解释执行,不需要对代码进行编译。这种模式下会摒弃JIT带来的性能优势,因为解释器逐条读入,逐条运行;此外还有一个“-Xcomp”参数,告诉JVM关闭解释器,不需要解释执行。
此外,还有一种新的编译方式,即AOT(Ahead-of-Time Compilation),直接将字节码编译成机器码,避免JIT预热等各方面的开销。JVM作为一个强大的平台,不仅仅只有Java语言可以运行在JVM上,其他合规的字节码都可以运行,如Scala、Jython等。