谈谈你对Java平台的理解?Java是解释执行吗?
Java是面向对象的语言,最显著的特性有两个方面:
1.Write once ,run anywhere.跨平台能力。
2.垃圾收集(GC,garbage collection),Java通过GC回收分配内存。
JRE,Java运行环境,包含了JVM和Java类库,以及一些模块等。
JDK,可以看做是JRE的一个超集,提供了更多工具。比如编译器和各种诊断工具等。
Java是解释执行,这个说法不太准确。
我们开发的Java源代码,首先通过javac编译成为字节码(bytecode),
然后在运行时,通过JVM内嵌的解释器将字节码转换成为最终的机器码。
但是常见的JVM,比如我们大多数情况使用的Oracle JDK提供的Hotspot JVM,
都提供了JIT(just-in-time)编译器,也就是通常说的动态编译器,
JIT能够在运行时将热点代码编译成机器码,这种情况下部分热点代码就属于编译执行了。
经常总结,例如Java语言特性,
包括泛型,lambda等语言特性,基础类库,包括集合,IO/NIO,网络,并发,安全等基础类库。
或者谈谈JVM的一些基础概念和机制,比如类的加载机制,加载,验证,链接,初始化,
自定义Class-loader等。还有垃圾收集的基本原理,常见的垃圾收集器,
如SerialGC,Parallel GC,CMS,G1等。
JDK包含哪些工具或Java领域内哪些工具等,编译器,运行时环境,安全工具,诊断和监控工具等
Java分为编译期和运行期。
javac的编译,编译Java源码生成.class文件,里面是字节码,而不是可以直接执行的机器码。
Java通过字节码和Java虚拟机这种跨平台的抽象,屏蔽了操作系统和硬件的细节,
是一次编译,到处执行的基础。
运行时,JVM会通过类加载器(Class-loader)加载字节码,解释或编译执行。
JDK8实际是解释和编译混合的一种模式。
除了我们常见的Java使用模式,还有一种新的编译方式,AOT(Ahead-of-Time Compilation),
直接将字节码编译成机器代码,避免了JIT预热等各方面的开销。
比如Oracle JDK 9就引入了实验性的AOT特性,并且增加了新的jaotc工具。
还支持分层编译和AOT协作使用,这两者不是二选一的关系。
参考文档: http://openjdk.java.net/jeps/295
jit是运行时(动态编译)才做的,需要预热才知道哪些是热点
aot是编译器的,静态的,直接变成类似类库的东西。
动态编译会缓存起来,适合重复使用的场景。