我所理解的Java平台

对于Java技术体系,相信每个Java程序员都会惊叹于整个技术栈的庞大,很多时候会有入门到放弃的心态,因为技术在不断更新,作为Java程序员也时刻保持进步学习状态,这样才能跟上技术的发展。对于我自己来说,同样也是使用Java技术栈工作多年,无论是面试还是日常工作中同事技术交流,会有很多Java相关知识点总感觉没有掌握到位,经常是似懂非懂。

因此希望能通过写作文章来对Java的知识点进行巩固,一方面是希望自己能对Java平台理解更深刻点,另一方面也是希望能通过这样以抛出问题,后续解答的方式进一步加强学习,以便达到巩固和掌握知识点。

那么今天我想谈论的话题是这么一道面试题:「谈谈你对 Java 平台的理解?“Java 是解释执行”,这句话正确吗?

思维导图

针对Java平台理解,我的回答是如下思维导图:

JavaCore01

从四个方面来回答自己对于Java平台的理解:

  • 基本特性
  • Java类库
  • Java虚拟机
  • 工具

基本特性

Java平台有什么基本特性呢?有面向对象、反射、泛型,这三点也是我们在实际工作项目中会用经常用到的。

面向对象(OOP)是一种编程思想,相对于面向过程来说,更符合我们人类来阅读代码的习惯,更容易写出通俗易懂的代码,而面向过程对于计算机来说,逐行加载执行更便利。面向对象三大特性,封装、重载、多态,具体什么含义就不展开了,网上一搜一大把。我更想强调的是,这三大特性引申出软件设计六大原则,如果你设计的程序围绕的这六大原则,从软件架构角度来看基本不会太差,合乎主流软件设计潮流。

至于反射,也是Java平台的一大利器,可以满足动态加载功能和并行开发模式,比如很多Java框架都是利用反射机制达到开发的便利性,提高程序员开发效率,让程序员可以更专注在自身业务开发上。

最后一点,泛型机制,主要是为了提高开发稳定性,也就是说类型安全,极大提高了程序健壮性,并且泛型机制还借鉴模板机制,对于同一种行为规范,可以套用在不同的数据类型上。

Java类库

除了基本特性之外,Java平台还有一个很大特色是丰富的类库。

比如基础类库:集合、IO/NIO、网络、并发、安全等。我们日常工作常用的容器类库,ArrayList、Map,都有着共同父类,看张图,你就清楚了,这些系统自带的容器类:

JavaCore02

除此之外,还有线程安全类和丰富的第三方类库。

Java虚拟机

Java为何能受广大开发者喜爱,很重要的一点就是跨平台,其中跨平台最大的特色就是 Write once,run anywhere (写一次,到处运行)。那么跨平台的关键因素就是Java虚拟机。看下Java虚拟机的结构图:

JavaCore03

其中重点了解下JVM中每个模块的作用,主要包括以下几个运行时区域:

1,程序计数器(PC Register),主要是当前线程所执行的字节码的行号指示器。
2,Java虚拟机栈(Stack)Java中的每个方法在执行的同时都会创建一个栈帧用于存储局部变量表、操作数栈、动态链接、方法出口等信息。我们常见的StackOverflowError错误,就是常见栈深度大于虚拟机所允许的深度。
3,本地方法栈(Native Method Stack),执行的是虚拟机使用到Nativie方法服务。
4,Java堆,也叫Java Heap,这个是Java虚拟机所管理的内存中最大的一块,Java堆是被所有线程共享的一块内存区域,在虚拟机启动时就创建了。几乎所有的对象实例都在这里分配内存。
5,方法区(Class Area)。这个是主要是用以虚拟机加载类信息、常量、静态变量、编译之后的代码等等。

JVM还有一个特性是垃圾回收策略,相信不少程序员在面试时经常会被问到JVM的垃圾回收策略是什么,新生代、老年代等。主要的垃圾回收策略有这么几种算法:标记-清除算法、复制算法、标记整理算法、分代收集算法,这几个算法的依据是基于可达分析和引用计数思想,来判断对象是否可回收,进一步达到垃圾回收目的。

至于Java编译过程,有这四步:源码-字节码-虚拟机解释-机器码,hotspot 提供了JIT编译器,Java类加载机制,常用版本 JDK(如 JDK 8)内嵌的 Class-Loader,例如 Bootstrap、 Application 和 Extension Class-loader;类加载大致过程:加载、验证、链接、初始化

工具

我们日常会接触到 JRE(Java Runtime Environment)或者 JDK(Java Development Kit)。 JRE,也就是 Java 运行环境,包含了 JVM 和 Java 类库,以及一些模块等。而 JDK 可以看作是 JRE 的一个超集,提供了更多工具,比如编译器、各种诊断工具等。

我们需要善于利用这些工具,了解各种工具用法,以便在面对实际问题时,可以通过不同工具进一步排查,很多时候面对问题时候,往往不是解决问题有多困难,而是分析定位问题原因有多耗时。

小结

总的来说,我是从以上四个方面来理解所谓的Java平台,除此之外,还想补充一点,那就是「静态编译与动态解释」这点。 静态编译的程序在执行前全部被翻译为机器码,通常将这种类型称为AOT (Ahead of time)即 “提前编译”; 而解释执行的则是一句一句边翻译边运行,通常将这种类型称为JIT(Just-in-time)即“即时编译”。 AOT程序的典型代表是用C/C++开发的应用,它们必须在执行前编译成机器码,而JIT的代表则非常多,如JavaScript、python等。 事实上,所有脚本语言都支持JIT模式。但需要注意的是JIT和AOT指的是程序运行方式,和编程语言并非强关联的,有些语言既可以以JIT方式运行也可以以AOT方式运行,如Java、Python,它们可以在第一次执行时编译成中间字节码、然后在之后执行时可以直接执行字节码。

至于Java语言是否是解释执行,因为Java平台有AOT也有JIT,因此Java语言是可以进行解释执行的,可以直接将字节码编译成机器代码,这样就避免了 JIT 预热等各方面的开销,比如 Oracle JDK 9 就引入了实验性的 AOT 特性,并且增加了新的 jaotc 工具。

,