《深入理解Java虚拟机》第三版读书笔记(三)

深入理解Java虚拟机(3)走进Java

文章目录

  • 深入理解Java虚拟机(3)走进Java
    • 1.3 Java发展史
      • 1991.4 Java前传
      • 1995.5.23 诞生
      • 1996.1.23 JDK1.0
      • 1996.4 流行
      • 1996.5 第一届JavaOne
      • 1997.2.19 JDK1.1
      • 1998.12.4 JDK1.2
      • 1999.4.27 HotSpot
      • 2000.5.8 JDK1.3
      • 2002.2.13 JDK1.4
      • 2004.9.30 JDK5
      • 2006.12.11 JDK6
      • 2009.2.19 JDK7的开端
      • 2009.4.20 转手
      • 2011.7.28 JDK7
      • 2014.3.18 JDK8
      • 2017.9.21 JDK9
      • 2018.3.20 JDK10
      • 2018.9.25 JDK11
      • 2018.10 最后一届JavaOne
      • 2019.2 接替
      • 2019.3.20 JDK12

1.3 Java发展史

1991.4 Java前传

Java的前身——Oak

Oak:James Gosling(詹姆斯 高斯林)博士领导的“绿色计划”(Green Project)启动,开发的一款产品。

Oak的意思是橡树,得名于詹姆斯 高斯林办公室外的一颗橡树。

Oak当时在市场上并不算成功,但随着1995年互联网潮流的兴起,Oak找到自己的定位,蜕变成Java语言。

1995.5.23 诞生

Oak改名为Java,在SunWord大会发布Java1.0。口号:”Write Once,Run Anywhere“

1996.1.23 JDK1.0

JDK1.0,第一个正式版本的运行环境。纯解释执行的Java虚拟机实现(Sun Classic VM)。

JDK1.0代表技术
Java虚拟机
Applet
AWT

Applet:小程序。

AWT:Abstract Window Toolkit,抽象窗口工具包。

该包提供了一套与本地图形界面进行交互的接口,是Java提供的用来建立和设置Java的图形用户界面的基本工具。

1996.4 流行

十个最主要的操作系统和计算机供应商声明将在其产品中嵌入Java技术。同年9月,已有大约8.3万个网页应用了Java技术来制作。

1996.5 第一届JavaOne

Sun公司于美国旧金山举行了首届JavaOne大会,从此JavaOne成为Java语言开发者一年一度的技术盛会。

JavaOne大会:JavaOne 是在 Sun 正式发布 Java 1.0 之后,组织起来的专属于 Java 的会议。从 1996 年开始,每年都会在旧金山举办一次。

然而近日(2018),Oracle 宣布取消 JavaOne 的会议,并用 Oracle Code One 取而代之,其名字由 JavaOne 与 Oracle OpenWorld 结合而来,其活动地点从一直以来的 Moscone Center 迁移到附近的酒店。

Oracle 方面称,这么做是为了更好地扩展会议内容,他们希望将更多的语言、技术和各个领域的开发人员容纳进来,在会议上就 Go,Rust,Python,JavaScript 和 R 等更多的语言进行会谈,而不仅仅限于 Java。

此摘要来源于:

https://www.oschina.net/news/95533/oracle-code-one

1997.2.19 JDK1.1

Sun公司发布 JDK1.1。

JDK1.1技术代表
JAR文件格式
JDBC
JavaBeans
RMI
内部类(Inner Class)
反射(Reflection)

JAR文件格式:JAR文件(Java归档,英语:Java Archive)是一种软件包文件格式。

通常用于聚合大量的Java类文件、相关的元数据和资源(文本、图片等)文件到一个文件,以便开发Java平台应用软件或库。

JDBC:Java Database Connectivity,Java数据库连接。

是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。

JavaBeans:JavaBeans事实上有三层含义。

  1. JavaBeans是一种规范,一种在Java(包括JSP)中可重复使用的Java组件的技术规范,也可以说成我们常说的接口。
  2. JavaBeans是一个Java的类,一般来说,这样的Java类将对应于一个独立的 .java文件 ,在绝大多数情况下,这应该是一个public类型的类。
  3. 当JavaBeans这样的一个Java类在我们的具体的Java程序中被实例之后,这就是我们面向对象的对象。

RMI:Remote Method Invocation,远程方法调用。

RMI大大增强了Java开发分布式应用的能力。

Java作为一种风靡一时的网络开发语言,其巨大的威力就体现在它强大的开发分布式网络应用的能力上,而RMI就是开发百分之百纯Java的网络分布式应用系统的核心解决方案之一。

内部类:在 Java 中,可以将一个类定义在另一个类里面或者一个方法里面,这样的类称为内部类。

广泛意义上的内部类一般来说包括这四种:成员内部类、局部内部类、匿名内部类和静态内部类。

反射:JAVA反射机制是指:

  • 在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法
  • 对于任意一个对象,都能够调用它的任意方法和属性

这种动态获取信息以及动态调用对象方法的功能称为java语言的反射机制。

1998.12.4 JDK1.2

JDK1.2,将Java技术体系分为J2SE、J2EE、J2ME三个方向。

JDK1.2代表技术
EJB
Java Plug-in
Java IDL
Swing
第一次内置了JIT(Just In Time)即时编译器
strictfp关键字
Collections集合类

EJB:Enterprise JavaBean,企业级JavaBean。

是一个用来构筑企业级应用的服务器端可被管理组件。

Java Plug-in:也就是我们通常说的Applet与JWS(Java Web Start),从技术上来讲,他们都隶属与RIA(Rich Internet Application)。

Java Plug-in的存在,使得在浏览器中运行Java程序成为可能,Java Plug-in在浏览器中作为插件存在,它扩展了浏览器的功能,也就是说在浏览器中,我们可以做的更多,更好。

Java IDL:Interface Definition Language,接口定义语言,是Java 2开发平台中的CORBA(Common Object Request Broker Architecture,公用对象请求代理程序体系结构)功能扩展。

在Java 2中引入JavaIDL,使得利用OMG IDL能够定义服务对象的基本功能,并且将IDL根据CORBA规范的要求,映射到Java语言,并以此开发出标准的具有互操作性和可连接性的分布式应用。

Swing:Swing是一个为Java设计的GUI工具包。

Swing是JAVA基础类的一部分,它包括了图形用户界面(GUI)器件如:文本框,按钮,分隔窗格和表。Swing提供许多比AWT更好的屏幕显示元素

JIT即时编译器:即时编译器(JIT compiler,just-in-time compiler)是一个把Java的字节码(包括需要被解释的指令的程序)转换成可以直接发送给处理器的指令的程序。

strictfp:strictfp 关键字可应用于类、接口或方法。使用 strictfp 关键字声明一个方法时,该方法中所有的float和double表达式都严格遵守FP-strict的限制,符合IEEE-754规范。

// strictfp关键字的案例
// Example of precision control with strictfp  
public strictfp class MyClass {  
    public static void main(String[] args)  
    {  
        float aFloat = 0.6710339f;  
        double aDouble = 0.04150553411984792d;  
        double sum = aFloat + aDouble;  
        float quotient = (float)(aFloat / aDouble);  
        System.out.println("float: " + aFloat);  
        System.out.println("double: " + aDouble);  
        System.out.println("sum: " + sum);  
        System.out.println("quotient: " + quotient);  
    }  
} 
/* 
	执行结果:
    float: 0.6710339
    double: 0.04150553411984792
    sum: 0.7125394529774224
    quotient: 16.167336
*/

Collections集合类:我们是使用数组来保存数据,但是他的长度一旦创建,就已经确定了,当我们要动态传入穿值,数组就有些局限了,集合类就孕育而生。

所谓集合,就是来保存,盛装数据,也可称为容器类,使用的类 在java.util 包里

1999.4.27 HotSpot

HotSpot虚拟机诞生。

2000.5.8 JDK1.3

JDK1.3。

JDK1.3代表技术
改进数学运算
添加新的Timer API
JNDI服务由扩展服务转变成一项平台级服务提供
使用OMRBA IIOP来实现RIM通信协议(此处存疑)
添加大量的Java 2D API
添加JavaSound类库

JNDI服务:JNDI是 Java 命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一。

TimerAPI:Timer 类是计时器的接口,它使您能按指定的时间序列运行代码。

使用 start() 方法来启动计时器。为 timer 事件添加事件侦听器,以便将代码设置为按计时器间隔运行。可以创建 Timer 对象以运行一次或按指定间隔重复运行,从而按计划执行代码。根据 Egret 的帧速率或运行时环境(可用内存和其他因素),运行时调度事件的间隔可能稍有不同。

JavaSound:用于处理音频。

2002.2.13 JDK1.4

JDK1.4,标志着Java真正走向成熟的一个版本。

JDK1.4代表技术
正则表达式
异常链
NIO
日志类
XML解析器
XSLT转换器

正则表达式:正则表达式(regular expression)描述了一种字符串匹配的模式(pattern),可以用来检查一个串是否含有某种子串、将匹配的子串替换或者从某个串中取出符合某个条件的子串等。

异常链:常常会再捕获一个异常后跑出另外一个异常,并且希望把异常原始信息保存下来,这被称为异常链。

NIO:java.nio全称java non-blocking IO(实际上是 new io) ,为所有的原始类型(boolean类型除外)提供缓存支持的数据容器,使用它可以提供非阻塞式的高伸缩性网络。

XML:可扩展标记语言,标准通用标记语言的子集,简称XML。

是一种用于标记电子文件使其具有结构性的标记语言,常用于配置文件。

XSLT:XSL 指扩展样式表语言(EXtensible Stylesheet Language)。XSLT 指 XSL 转换。

2004.9.30 JDK5

JDK1.5,是官方声明可以支持Windows 9x操作系统的最后一个JDK版本。

JDK1.5代表技术
自动装箱
泛型
动态注解
枚举
可变长参数
遍历循环(foreach循环)
改进了Java内存模型(Java Memory Model,JMM)
提供java.util.concurrent并发包

自动装箱:把基本数据类型转换成对应包装类的过程就是打包装,英文对应于boxing,中文翻译为装箱。

在Java SE5中,为了减少开发人员的工作,Java提供了自动拆箱与自动装箱功能。

自动装箱:就是将基本数据类型自动转换成对应的包装类。

自动拆箱:就是将包装类自动转换成对应的基本数据类型。

泛型:泛型的本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参具体限制的类型)。

动态注解:注释是给人看的,而注解是给程序(框架)看的。在Servlet3.0中可以使用注解来替代配置文件,开发者就不用再写配置文件了,而是写注解,然后Tomcat来读取注解。

枚举:它是一种特殊的数据类型,之所以特殊是因为它既是一种类(class)类型却又比类类型多了些特殊的约束,但是这些约束的存在也造就了枚举类型的简洁性、安全性以及便捷性。

// 可变长参数arr
public static void add(int... arr){ //长度是0
    int result = 0;
    for(int item : arr){
    	result+=item;
    }
	System.out.println("总和:"+ result);
}
public void main(String[] args) {
    add();
    add(1,2);
    add(1,2,3);
    add()
}

Java内存模型:java内存模型(Java Memory Model,JMM)是java虚拟机规范定义的,用来屏蔽掉java程序在各种不同的硬件和操作系统对内存的访问的差异,这样就可以实现java程序在各种不同的平台上都能达到内存访问的一致性。

可以避免像C++等直接使用物理硬件和操作系统的内存模型在不同操作系统和硬件平台下表现不同,比如有些C/C++程序可能在Windows平台运行正常,而在Linux平台却运行有问题。

java.util.concurrent并发包:java.util.concurrent包(J.U.C)中包含的是java并发编程中有用的一些工具类,包括几个部分:

  1. locks部分:包含在java.util.concurrent.locks包中,提供显式锁(互斥锁和速写锁)相关功能;
  2. atomic部分:包含在java.util.concurrent.atomic包中,提供原子变量类相关的功能,是构建非阻塞算法的基础;
  3. executor部分:散落在java.util.concurrent包中,提供线程池相关的功能;
  4. collections部分:散落在java.util.concurrent包中,提供并发容器相关功能;
  5. tools部分:散落在java.util.concurrent包中,提供同步工具类,如信号量、闭锁、栅栏等功能;

2006.12.11 JDK6

JDK1.6。产品线开始以Java EE 6、Java SE 6、Java ME6的新命名。

JDK1.6代表技术
提供初步的动态语言支持(通过内置Mozilla JavaScript Rhino引擎实现)
提供编译期注解处理器
微型HTTP服务器API
改进锁与同步
改进垃圾收集
改进类加载

Mozilla JavaScript Rhino引擎:Rhino 是一种动态类型的、基于对象的脚本语言。

它可以简单地访问各种 Java 类库。

编译API:JDK 6 的编译器 API 的另外一个强大之处在于,它可以编译的源文件的形式并不局限于文本文件。JavaCompiler 类依靠文件管理服务可以编译多种形式的源文件。比如直接由内存中的字符串构造的文件,或者是从数据库中取出的文件。这种服务是由 JavaFileManager 类提供的。

2009.2.19 JDK7的开端

JDK1.7的第一个里程碑版本。

2009.4.20 转手

Oracle收购Sun公司。

2011.7.28 JDK7

JDK1.7最后一个里程碑。

JDK1.7是可以支持Windows XP系统的最后一个版本。

JDK1.7代表技术
新的G1收集器
加强对非Java语言的调用支持
升级类加载架构

G1收集器:G1(Garbage First)垃圾收集器是当今垃圾回收技术最前沿的成果之一。关注最小时延的垃圾回收器,也同样适合大尺寸堆内存的垃圾收集。

2014.3.18 JDK8

JDK1.8。自JDK1.8开始,Oracle启用JEP来定义和管理纳入新版JDK发布范围的功能特性。

JEP:JDK Enhancement Proposals,java表达式分析器。

JEP是一个用来转换和计算数学表达式的java库。通过这个程序包,用户可以以字符串的形式输入一个、任意的公式,然后快速地计算出结果。

JEP示例:

package com.newre.demo2;

import org.nfunk.jep.JEP;
import org.nfunk.jep.Node;
import org.nfunk.jep.ParseException;

/**
 * JEP示例
 * @author newre
 */
public class App {
    public static void main( String[] args ){
        try {
        	String exp = "((a+b)*(c+b))/(c+b)/a";
        	JEP jep = new JEP();
        	jep.addVariable("a", 5);
        	jep.addVariable("b", 16);
        	jep.addVariable("c", 66);
        	Node parse = jep.parse(exp);
        	Object evaluate = jep.evaluate(parse);
        	System.out.println(
                "((5+16)*(66+16))/(66+16)/5 = " + 
                evaluate
            );
	// 运行结果:((5+16)*(66+16))/(66+16)/5 = 4.2
        }catch (ParseException e) {
        	e.printStackTrace();
		}
    }
}
###########################################
maven相关依赖:
<dependency>
	<groupId>org.scijava</groupId>
	<artifactId>jep</artifactId>
	<version>2.4.2</version>
</dependency>
JDK1.8代表技术
JEP 126:对Lambda表达式的支持
JEP 104:内置Nashorn JavaScript引擎的支持
JEP 150:新的时间、日期API
JEP 122:彻底移除HotSpot的永久代

Lambda表达式:可以将Lambda表达式理解为一个匿名函数。

Lambda表达式允许将一个函数作为另外一个函数的参数。

我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码作为实参),也可以理解为函数式编程,将一个函数作为参数进行传递。

Lambda表达式能够让程序员的编程更加高效

Nashorn JavaScript引擎:Nashorn完全支持ECMAScript 5.1规范以及一些扩展。

它使用基于JSR 292的新语言特性,其中包含在JDK 7中引入的 invokedynamic,将JavaScript编译成Java字节码。

与先前的Rhino实现相比,这带来了2到10倍的性能提升。

2017.9.21 JDK9

JDK1.9。

JDK1.9代表技术
Jigsaw
JS Shell工具
JLink
JHSDB
整顿了HotSpot各个模块各自为战的日志系统
支持HTTP2 客户端API
以及其余总共多达91个JEP

Jigsaw:是万维网协会(W3C)的一个Web服务器,它是为展示新的Web协议和其他特征而设计的。

Jigsaw是用Java编程语言写的,并且它是一个开源的软件。你可以在Unix或Windows 2000上从W3C网址下载Jigsaw。

它旨在为Java SE平台设计、实现一个标准的模块系统,并应用到该平台和JDK中。该项目由Java编程语言编译器小组赞助。

JS Shell:JShell的目标是提供一个交互工具,通过它来运行和计算java中的表达式。

开发者可以轻松地与JShell交互,其中包括:编辑历史,tab键代码补全,自动添加分号,可配置的imports和definitions。

可用命令行使用JShell:

《深入理解Java虚拟机》第三版读书笔记(三)_第1张图片

JLink:可以使用jlink工具来创建一个运行时映像,它使用一种名为JIMAGE的新文件来存储模块。

JDK 9附带jimage工具,可以浏览JIMAGE文件的内容。

JHSDB:HotSpot Debugger的简称。

由于Serviceability Agent(服务性代理)在使用的时候会先attach进程(固定进程),然后暂停进程进行snapshot,最后deattach进程(进程恢复运行),使用HSDB时要注意这一点。

HTTP2客户单API

主要是基于jdk.incubator.httpclient模块。

jdk.incubator.httpclient模块主要提供了如下API:

  • HttpClient类
  • HttpRequest类
  • HttpResponse类
  • WebSocket接口

2018.3.20 JDK10

JDK10的主要研发目标是内部重构,对于普通用户而言JDK10的新特性几乎没有。

JDK10代表技术
统一源仓库
统一垃圾收集器接口
统一即时编译器接口(JVMCI在JDK9已经有了,此处引入了新的Graal即时编译器)
以及其余总共12个JEP

JVMCI:JVM编译器接口。

Graal:它已经在JDK中,因此将它作为实验JIT将主要用于测试和调试工作。要启用Graal作为JIT编译器,须在Java命令行上使用以下选项:

-XX:+UnlockExperimentalVMOptions

-XX:+UseJVMCICompiler

2018.9.25 JDK11

JDK11。这是一个LTS版本的JDK,包含17个JEP。

自此,Java开始收费(两个版本,免费版和商业版)。

JDK11代表技术
ZGC垃圾收集器
改进Lambda语法(类型推断)

ZGC:Z Garbage Collector,是一个可伸缩的、低延迟的垃圾收集器。

主要为了满足如下目标进行设计:

  • 停顿时间不会超过10ms

  • 停顿时间不会随着堆的增大而增大(不管多大的堆都能保持在10ms以下)

  • 可支持几百M,甚至几T的堆大小(最大支持4T)

2018.10 最后一届JavaOne

在1996年诞生的大会,成为Oracle下一个被裁撤的对象。

从此,JavaOne大会停办,合并入Oracle CodeOne大会中。

2019.2 接替

Oracle宣布在六个月之后就放弃了对上一个版本OpenJDK的维护。

RedHat结果了OpenJDK8和OpenJDK11的管理权利和维护职责。

2019.3.20 JDK12

JDK12。只包含8个JEP。

JDK12代表技术
Switch表达式
Java微测试套件(JMH)
Shenandoah垃圾收集器

Switch表达式:好比Java8中的Lambda表达式一样,是为开发者准备的新特性。

Switch表达式示例:

// 原switch写法:
switch(day) {
    case MONDAY:
    case FRIDAY:
    case SUNDAY:
        System.out.println(6);
        break;
    case TUESDAY:
        System.out.println(7);
        break;
    case THURSDAY:
    case SATURDAY:
        System.out.println(7);
        break;
    case WEDNESDAY:
        System.out.println(7);
        break;
}
// Switch表达式写法:
switch(day) {
case MONDAY,
     FRIDAY, 
     SUNDAY -> System.out.println(6);
case TUESDAY -> System.out.println(7);
case THURSDAY, SATURDAY -> System.out.println(7);
case WEDNESDAY -> System.out.println(7);
}
// 更简洁的Switch表达式写法:
int numLetters = switch(day) {
    case MONDAY, FRIDAY, SUNDAY -> 6;
    case TUESDAY -> 7;
    case THURSDAY, SATURDAY -> 8;
    case WEDNESDAY -> 9;
}

JMH:Java Microbenchmark Harness,是专门用于代码微基准测试的工具套件。

是基于方法层面的基准测试,精度可以达到微秒级。当你定位到热点方法,希望进一步优化方法性能的时候,就可以使用JMH对优化的结果进行量化的分析。

Shenandoah:跟ZGC一样也是面向low-pause-time(低暂停时间)的垃圾收集器,不过ZGC是基于colored pointers来实现,而Shenandoah GC是基于brooks pointers来实现。

你可能感兴趣的:(java核心功能实现原理,java,jvm,编程语言)