一、两大特性
书写一次,到处运行。
垃圾收集。
JRE包含JVM和Java类库。
JDK包含JVM、编译器、各种诊断工具等。
二、执行方式
解释执行:
编写源代码
Javac编译成字节码
运行时JVM内嵌的解释器将字节码转换成为最终的机器码
常见的JVM(Hotspot JVM):
JIT编译器,动态编译器
在运行时将热点代码编译成机器码
这种情况属于编译执行,而不是解释执行
三、语言特性:泛型、Lambda等
四、基础类库:集合、IO/NIO、网络、并发、安全等
五、类加载机制
常用版本JDK内嵌的Class-Loader:Bootstrap、Application和Extension Class-loader。
类加载大致过程:加载、验证、连接、初始化《深入理解Java虚拟机》。
自定义Class-Loader。
垃圾回收的基本原理。
常见的垃圾收集器:SerialGC、Parallel GC、CMS、G1等,各适用于什么样的工作负载。
六、JDK及Java领域的工具
编译器、运行时环境、安全工具、诊断和监控工具等
七、Java平台
Java/JVM生态:Java EE,Spring,Hadoop,Spark,Cassandra,ElasticSearch,Maven。
特性:基本语言特性,面向对象,反射,泛型。
类库:核心类库,IO/NIO,网络,utils等
安全类库
jdk,management等类库
海量第三方类库
虚拟机:垃圾收集器、运行时、动态编译、辅助功能,如JFR等。
工具:辅助工具,如jlink,jar,jdeps之类
编译器,javac、sjavac
诊断工具:jmap,jstack,jconsole,jhsdb,jcmd
八、一次编译,到处运行的基础
Javac将源码编译成“.class”文件,里面是字节码,不是可以直接执行的机器码。
通过字节码和跨平台的抽象,屏蔽操作系统和硬件的细节。
九、解释或编译执行
主流Java版本:
JDK8,解释和编译混合模式(-Xmixed)。运行在Server模式的jvm,会进行上万次调用收集足够信息进行高效的编译,client模式门限是1500次。
Oracle Hotspot JVM内置两个不同的JIT compiler,C1对应client模式,适用于对启动速度敏感的应用,C2对应server模式,为长时间运行的服务器端应用进行优化。默认采用分层编译(TieredCompilation)。
虚拟机启动时,运行模式选择:
-Xint,只进行解释执行,不对代码进行编译。解释器逐条读入,逐条解释运行的。
-Xcomp,关闭解释器,不要进行解释执行,最大优化级别。
[-Xcomp会导致JVM启动变得慢非常多,有些JIT编译器优化方式,比如分支预测,如果不进行profiling,往往并不能进行有效优化。]
AOT(Ahead-of-Time Compilation)编译方式,直接将字节码编译成机器代码。
Oracle JDK 9引入了实验性的AOT特性,增加新的jaotc工具。
把某个类或者某个模块编译成为AOT库:
jaotc --output libHelloTC.so HelloTC.class
jaotc --output libjava.base.so --module java.base
java -XX:AOTLibrary=./libHelloTC.so,./libjava.base.so HelloTC
Oracle JDK支持分层编译和AOT协作使用,两者并不是二选一的关系。http://openjdk.java.net/jeps/295
AOT除这种方式,早有第三方工具(GCJ、Excelsior JET)提供相关功能。
JVM上运行的语言:本质上合规的字节码都可以运行,Clojure、Scala、Groovy、JRuby、Jython等大量JVM语言,活跃在不同的场景。