一、Java的发展历史
(1)1991年,Sun公司成立由 James Gosling 领导的"Green 计划",后因C++无法满足开发要求,所以开发新的语言:Oak.后因Oak商标已被人注册,于是更名为Java;
(2)1995年5月23日,Sun公司发布Java;
(3)1996年,Sun公司发布 JDK1.0 版本,这个版本包含两个部分:运行环境(JRE)和开发环境(JDK);
(4)1997年,Sun公司发布 JDK1.1 版本,增加JIT(即时编译)编译器;
(5)1998年,Sun公司发布 JDK1.2 版本,将Java分成了J2EE,J2ME和J2SE;
(6)2000年,Sun公司发布 JDK1.3 版本,这个版本并无太大改动;
(7)2002年,Sun公司发布 JDK1.4 版本,这个版本因为IBM,SAS等多家公司参与开发,是最为成熟的版本;
(8)2004年,Sun公司发布 JDK1.5 版本,并更名为JavaSE5.0,JavaEE和JavaME。增加了泛型、增强for语句、可变形参、注释、自动拆箱和装箱等功能;
(9)2006年,Sun公司发布 JDK1.6 版本。后来Oracle收购了Sun公司,由Oracle公司继续开发Java的后续版本。也因为换了公司,所以从JDK1.6开始后续版本改动比较大,这也就是很多老项目必须要求JDK1.6版本开发的原因;
(10)2011年,历时5年,Oracle公司发布 JavaSE 7 版本,增加了二进制整数、支持字符串的switch语句、菱形语法、多异常捕捉,Try语句等新特性;
(11)2014年,Oracle公司发布 JavaSE 8 版本,增加Lambda表达式和流式编程等,并添加了大量的util工具类;
(12)2017年,Oracle公司发布 JavaSE 9 版本,这个版本升级了模块化系统,并使用了高效的G1垃圾回收器;
二、Java语言机制
Java包含 编译型和解释型 两种高级语言特性。
Java文件由Javac编译器进行编译,生成字节码文件(.class文件)。然后由JVM虚拟机解释并执行,生成计算机能理解的特定机器码执行。
三、JVM虚拟机
JVM是Java实现跨平台的最核心的部分,所有的java程序会首先被编译为.class的类文件(又叫字节码文件),这类文件可以在JVM中的解释器解释成为具体平台上的机器指令执行。只要不同系统(Windows,linux,Mac..)安装对应JVM虚拟机,就可以实现java的.class程序可以在不同操作系统上均可以运行。java语言是跨平台的,java虚拟机不是跨平台的。
JVM内存区域分5个部分:
①虚拟机栈:虚拟机栈描述的是Java方法执行的内存模型,可用于存储局部变量表、操作数栈、动态链接、方法出口等信息。虚拟机栈为线程私有。
②堆:Java虚拟机中内存最大的一块,被所有线程共享。他的作用主要是用来存放对象实例,几乎所有对象实例都在堆中分配内存。堆也是垃圾收集器管理的主要区域,所以也叫GC堆。
③方法区:用于存储已被虚拟机加载的各类信息、常量、静态变量、即时编译器编译后的的代码等数据。方法区也是被各个线程共享的区域。
④本地方法栈:为虚拟机使用到Native方法服务的栈区。
⑤程序计数器:是一块较小的内存空间,主要用于当前线程所执行的字节码的行号指示器。在JVM中字节码解释器工作时就是通过改变程序计数器的值来选取下一条需要执行的字节码指令。
四、G1垃圾回收器
当一个对象不再被引用时,JVM会按照特定的垃圾收集算法来回收它的内存空间,这就叫垃圾回收(又叫GC)
垃圾收集算法:
①标记-清除算法:标记所有需要回收的对象,然后统一回收。使用的收集器有 Serial收集器(最早的收集器)、ParNew收集器 、CMS收集器。
②复制算法:将内存分成两块,每次只使用其中一块。当使用的这一块内存用完时,就将存活的对象复制到另一块内存上,并且将已使用的这块内存清理掉。使用此算法的收集器有 Parallel Scavenge收集器 、Parallel Old收集器。
③标记-整理算法:标记所有需要回收的对象,将存活的对象向一端移动,然后清理掉端边界以外的内存。使用此算法的收集器有 Serial Old收集器。
④分代收集算法:将Java堆分成新生代和老年代,不同的区域采用不同的算法进行回收。使用此算法的收集器有 G1收集器。