谈谈你对Java平台的理解

  1. Java是一门面向对象的语言,在Java中一切都是对象Object,最基本的特性有封装、继承与多态。封装是将一些属性(或者叫字段)和方法都包装成一个类;继承是一个类(这个类叫子类)可以继承另一个类(这个类叫父类),这样的好处是避免重复大量的代码,也容易维护;多态是父类可以接受多个子类,我们在编写代码时,具体的类别不知道是哪一个,此时可以使用父类,到运行时才确定是哪一个子类。
  2. 提供了各种类库
    • 核心类库,如IO/NIO,网络,utils,并发,集合等
    • 安全类库
    • jdk.management等类库
    • 海量的第三方类库
  3. Java虚拟机
    • 垃圾收集器
    • 运行时 动态编译
    • 辅助功能,如JFR
  4. 工具
    • 辅助工具,如jlink,jar,jdeps
    • 编译器,javac、sjavac
    • 诊断工具,jmap、jstack、jcmd、jconsole
  5. Java生态,Spring、Hadoop、Spark、Maven
JRE与JDK的理解:
  • JRE(Java Runtime Environment)是Java的运行环境,主要包含的是JVM和一些类库,JRE或许在不久的将来将要消失了。
  • JDK(Java Development Kit)是开发环境,不仅包括了JRE,还有其他的代码诊断工具、编译器等。
一次编译,处处运行的理解:.java文件首先编译成.class文件,然后通过JVM运行,JVM屏蔽了底层硬件的差异性。
  • 解释执行:.java文件首先编译成.class文件,然后将class文件按照字节来转成机器码执行;
  • 即时编译(JIT Just in time):.java文件首先编译成.class文件,然后将一个方法区里面的所有代码转成机器码;
  • AOT(Ahead of time compilation):JDK9新特性,直接将.class文件转成机器码

JIT编译器会将代码缓存到codecache,第二次遇到时直接执行;一般的解释器每次都要先解释后执行。至于那些是热点代码,简单的判断方法是:哪些代码经常出现在栈顶;哪些代码出现的次数超过阈值。

编译性语言与解释性语言的理解:
  • 编译性语言:在编译过程中直接生成目标平台的指令。比如C语言,直接将代码编译成硬件环境的机器码,在不同的硬件上面,每次都要重新编译。
  • 解释性语言:编译时生成中间代码,这个与平台无关,待运行时再将中间代码翻译成机器码。比如Java语言,生成class文件后,通过JVM可以在任意平台运行,但是需要注意不同平台的JVM是不一样的,有windows的、有Mac的、有Linux的。

Note:你可以参考极客时间的专栏《Java核心技术36讲》