从零开始学Java_第一篇 混合模式
做任何事情打好基础都是重中之重,编程更是如此。工作中由于长时间忙于业务分析,往往可能会忽略了基础的练习。从今天开始,我们进行从零开始学Java 的Java 基础学习分享。
第一篇分享,从一道经典面试题开始:
问题:
谈谈对Java平台的理解,Java是解释执行的语言吗?
这是一道开放型面试题,题目考察范围比较广,考察点比较多。作为开场面试者介绍自身知识储备,与面试官顺便聊聊Java 基础、Java 核心等技术也都比较合时宜。
在回答问题之前,先说下 Java 语言的两个主要特点:
其一是 Java 的跨平台性,所谓书写一次,到处执行;
其二是 Java 强大的 GC 垃圾回收机制,有了它使得开发人员在大部分情况下,不需要关心内存的分配和回收。
如果想要展开来说的话,Java 平台的理解可从如下几个方面入手 :
1. Java 语言特性 (泛型、lambda 表达式, 面向对象);
2. 基础类库 (集合、 IO/NIO、 并发、安全等);
3.Java 类加载机制,JDK 内嵌的 Class-Loader,如 BootStrap, Application, Extension 类加载过程;
4.垃圾收集的基本原理, 分代收集算法, 双亲委派机制;
.等等……
这些特性我们具体在以后的分享中会逐渐学习到,此处对 Java 平台的理解方面就不再深入探讨。
下面我们讨论下Java 到底是不是解释执行的语言?
准确来说 Java 是解释运行语言这句话是不正确的。
我们知道 Java 程序从源代码到运行的需要经历如下阶段:编码->编译->运行->调试。
也就是说Java源代码从编码到运行需要进行两次编译:
第一次是 Java 源码通过 javac 编译成字节码(.class)文件,Java 通过字节码文件和 JVM 跨平台的抽象,屏蔽了操作系统和硬件的细节,这是一次编译,到处运行的基础。
第二次是运行时通过 JVM 将字节码转换成最终的对应平台机器码。但是常见的 JVM ,如 Hotspot JVM,都提供了 JIT (just in time) 编译器,就是常说的动态变编译器, JIT 在运行时将热点代码编译成机器码, 这种情况下就属于编译执行,而不是解释执行。根据二八定律,消耗大部分系统资源的只有那一小部分的代码(热点代码),而这也就是 JIT 所需要编译的部分。JVM 会根据代码每次被执行的情况收集信息并相应地做出一些优化,因此执行的次数越多,它的速度就越快。
注:JIT 为方法级,它会缓存编译过的字节码在CodeCache 中,而不需要被重复解释。
结论:
JDK8 中实际采用的是解释和编译混合的一种模式,也就是所谓的混合模式(-Xmixed)。
扩展知识:
Java 虚拟机启动时, 可以指定不同参数:
-Xint 表示 JVM 只解释执行,不对代码进行编译。这样设置会导致 JVM 抛弃 JIT 可能带来的性能优势。由于解释器是逐条读入,逐条解释运行的,如果代码没有被 JIT 编译的话,再次运行时需要重复解析。
-Xcomp 表示 JVM 关闭解释器, 不进行解释执行。这样设置会导致将全部的代码编译成本地机器码,花费更多的时间,JVM 启动变慢很多。
JDK9 引入了一种新的编译模式 AOT (Ahead of Time Compilation),它是直接将字节码编译成机器码,这样就避免了 JIT 预热等各方面的开销。
关注一下,我写的就更来劲儿啦