JDK 9 介绍

本文涉及的产品
云解析 DNS,旗舰版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: Java 9提供了超过150项新功能特性,包括备受期待的模块化系统、可交互的REPL工具: jshell, JDK编译工具,语法层面的改变:Java公共API和私有代码,以及安全增强、扩展提升、性能管理改善等。

Java 9模块化介绍

介绍

​ 甲骨文公司已将Java 9版本从2017年3月推迟到20179月。导致推迟的原因是它提供了150多种新功能,其中包括新的模块系统和相当多的改进,这些改进有望带来更高的安全性,更多的可伸缩性和更好的性能管理。

​ Java 9提供了超过150项新功能特性,包括备受期待的模块化系统、可交互的REPL工具: jshell, JDK编译工具,语法层面的改变:Java公共API和私有代码,以及安全增强、扩展提升、性能管理改善等。
716e6020156549eeb0b2b80d51329648.png

Java SE 9:拼图项目

1.拼图项目将引入Java SE 9的全新概念:Java模块系统。

​ 这是Oracle Corp在Java SE 9版本中非常重要的项目。最初,他们作为Java SE 7 Release的一部分启动了该项目。但是,由于进行了很大的更改,它被推迟到Java SE 8,然后又被推迟了。现在它将与Java SE 9一起在2017年9月发布问世。

2.Java模块解决了什么问题

​ JDK类库目前太臃肿了,在一些微型设备上可能用不到全部的功能,在目前的情况下却不得不引用全部的类库。Java 9引入模块功能后,JDK、JRE、甚至是JAR都可以把用不到的类库排除掉,大大降低了依赖库的规模。

3.细节描述

​ 1.由于当前的JDK源代码jar文件太大,尤其是rt.jar,因此每次在运行时,我们不需要的也会给我们加载进去,就会导致资源浪费(运行内存),因此他们把rt.jar进行了拆分为95个jmod文件模块,每个模块下都会有一个module-info.java文件,它声明了模块的访问方式以及依赖关系。

image.png

Java SE 9模块系统的优点

1.由于Java SE 9将把JDK,JRE,JAR等分成较小的模块,因此我们可以使用所需的任何模块。因此,将Java应用程序缩减到

2小型设备非常容易。

3.易于测试和可维护性。
4.支持更好的性能。
5.由于public不仅是public,它还支持非常强的封装。
6.我们不能再访问内部非关键API。
7.模块可以非常安全地隐藏不必要的内部细节,我们可以获得更好的安全性。
8.应用程序太小,因为我们只能使用所需的模块。
9.它易于支持组件之间的较少耦合。
10.它易于支持单一职责原则(SRP)。

API层面介绍

​ String的底层优化: byte 是字节数据类型 ,是有符号型的,占1 个字节;大小范围为-128—127 。char 是字符数据类型 ,是无符号型的,占2字节(Unicode码 );大小范围 是0—65535 ;
image-20230417012116006.png

image-20230417015732194.png

// Java 9 改进的 Stream API 添加了一些便利的方法,使流处理更容易,并使用收集器编写复杂的查询。

// Java 9 为 Stream 新增了几个方法:dropWhile、takeWhile、ofNullable,为 iterate 方法新增了一个重载方法。

// takeWhile 方法

default Stream<T> takeWhile(Predicate<? super T> predicate)

// takeWhile() 方法使用一个断言作为参数,返回给定 Stream 的子集直到断言语句第一次返回 false。如果第一个值不满足断言条件,将返回一个空的 Stream。

// takeWhile() 方法在有序的 Stream 中,takeWhile 返回从开头开始的尽量多的元素;在无序的 Stream 中,takeWhile 返回从开头开始的符合 Predicate 要求的元素的子集

    Stream.of("a","b","c","","e","f").takeWhile(s->!s.isEmpty())
         .forEach(System.out::print);  



// dropWhile 方法和 takeWhile 作用相反的,使用一个断言作为参数,直到断言语句第一次返回 true 才返回给定 Stream 的子集。
default Stream<T> dropWhile(Predicate<? super T> predicate)

    Stream.of("a","b","c","","e","f").dropWhile(s-> !s.isEmpty())
         .forEach(System.out::print);


// 方法允许使用初始种子值创建顺序(可能是无限)流,并迭代应用指定的下一个方法。 当指定的 hasNext 的 predicate 返回 false 时,迭代停止。
static <T> Stream<T> iterate(T seed, Predicate<? super T> hasNext, UnaryOperator<T> next)
    IntStream.iterate(3, x -> x < 10, x -> x+ 3).forEach(System.out::println);


// ofNullable 方法可以预防 NullPointerExceptions 异常, 可以通过检查流来避免 null 值。

// 如果指定元素为非 null,则获取一个元素并生成单个元素流,元素为 null 则返回一个空流。
static <T> Stream<T> ofNullable(T t)
    long count = Stream.ofNullable(100).count();
      System.out.println(count);

      count = Stream.ofNullable(null).count();
      System.out.println(count);

Java 9 改进的 @Deprecated 注解

Deprecated 注解意思是若某类或某方法加上该注解之后,表示此方法或类不再建议使用,调用时也会出现删除线,但并不代表不能用,只是说,不推荐使用,因为还有更好的方法可以调用

注解 @Deprecated 可以标记 Java API 状态,可以是以下几种:

  • 使用它存在风险,可能导致错误
  • 可能在未来版本中不兼容
  • 可能在未来版本中删除
  • 一个更好和更高效的方案已经取代它。

语法层面改变

// JDK 7 try
try (FileInputStream inputStream = new FileInputStream("d:\\a.txt");
     FileOutputStream outputStream = new FileOutputStream("d:\\c.txt")){
   
   

}
// JDK 9 try优化
FileInputStream inputStream = new FileInputStream("d:\\a.txt");
FileOutputStream outputStream = new FileOutputStream("d:\\c.txt")
try (inputStream;outputStream){
   
   

}

// JDK9 新增接口方法
public interface MyInterface {
   
   
    //定义私有方法
    private void test1() {
   
   
        System.out.println("123");
    }

    void test2() {
   
   
        test1();
    }
}
全新的http客户端API

http1.1 采用长连接tcp,好处是不需要每次请求都需要创建一次tcp连接,坏处是请求需等待,而http2.0采用的是多路复用,在一个tcp连接可以处理多个请求,无需等待上一个请求处理完成,提高响应速度

Java 9模块系统之母

Java 9模块系统具有一个“ java.base”模块。它被称为基本模块。它是一个独立模块,不依赖于任何其他模块。默认情况下,所有其他模块都依赖于此模块。

这就是“ java.base”模块也被称为Java 9模块之母的原因。

它是所有JDK模块和用户定义模块的默认模块。

G1垃圾收集器

1.G1(Garbage-First)是一款面向服务端应用的垃圾收集器,主要针对配备多核CPU及大容量内存的机器,以极高概率满足GC停顿时间的同时,还兼具高吞吐量的性能特征

  1. 在JDK1.7版本正式启用,是JDK 9以后的默认垃圾收集器,取代了CMS 回收器。

查看 JDK 垃圾回收机制命令 cmd : java -XX:+PrintCommandLineFlags -version

Java 9对类加载器的改动

Java 源文件最终编译为 Class 文件,Class 文件中描述的各类信息,最终都需要加载到虚拟机中之后才能被运行和使用。

1.类加载的七个阶段

1.加载(Loading)

在加载阶段,Java 虚拟机需要完成以下三件事情:

1.通过一个类的全限定名来获取定义此类的二进制字节流。

2.将这个字节流所代表的静态存储结构转化为方法区的运行时数据结构。

3.在内存中生成一个代表这个类的 java.lang.Class 对象,作为方法区这个类的各种数据的访问入口。

加载阶段结束后,Java 虚拟机外部的二进制字节流就按照虚拟机所设定的格式存储在方法区之中,在 Java 堆内存中实例化一个 java.lang.Class 类的对象,这个对象将作为程序访问方法区中的类型数据的外部接口。

2.验证(Verification)

验证的目的是确保 Class 文件的字节流中包含的信息符合《Java 虚拟机规范》的全部约束要求,保证这些信息被当作代码运行后不会危害虚拟机自身的安全。

1.文件格式验证:
验证字节流是否符合 Class 文件格式的规范,并且能被当前版本的虚拟机处理。

2.元数据验证:
对字节码描述的信息进行语义分析,以保证其描述的信息符合《Java 语言规范》的要求。

3.字节码验证:
通过数据流分析和控制流分析,确定程序语义是合法的、符合逻辑的。

4.符号引用验证:
简单来说就是该类是否缺少或者被禁止访问它依赖的某些外部类、方法、字段等资源。此验证校验行为发生在虚拟机将符号引用转化为直接引用的时候,即「解析阶段」中进行。

3.准备(Preparation)

准备阶段是正式为类中定义的变量(静态变量)分配内存并设置类变量初始值的阶段,从概念上讲,这些变量所使用的内存都应当在方法区中进行分配。

4.解析(Resolution)

解析阶段是 Java 虚拟机将常量池内的符号引用替换为直接引用的过程。

解析动作主要针对类或接口、字段、类方法、接口方法、方法类型、方法句柄和调用点限定符这 7 类符号引用进行,

简单的理解为我们类中如果变量是其他类的类型、继承了父类、实现了接口,那么该阶段会做相关的解析

5.初始化(Initialization)

初始化阶段就是执行类构造器方法的过程

image-20230417030510906.png

2.类加载器对比

Java 9之前的类加载器分成三个层次(JDK 1.2之前是两个层次),分别是:

1.引导类加载器(boostrap class loader):虚拟机内置的类加载器,通常以null表示,从引导类路径加载。

2.扩展类加载器(extension class loader):从扩展目录加载类。它是JDK 1.2中引入的扩展机制的产物。它的父类加载器为引导类加载器。

3.应用类加载器(application class loader):从应用的CLASSPATH中加载类。它的父类加载器为扩展类加载器。

Java 9仍然保留了三层类加载器结构,不过为了支持模块系统,对它们做了一些调整。扩展机制被移除,扩展类加载器由于向后兼容性的原因被保留,不过被重命名为平台类加载器(platform class loader)。可以通过ClassLoader的新方法getPlatformClassLoader()来获取。Java 9中的内置类加载器如下所示。

1.引导类加载器:定义核心Java SE和JDK模块。

2.平台类加载器:定义部分Java SE和JDK模块。

3.应用或系统类加载器:定义CLASSPATH上的类和模块路径中的模块。
image-20230417024542374.png

目录
相关文章
|
6月前
|
JSON 编解码 Java
Java升级:JDK 9新特性全面解析“
Java升级:JDK 9新特性全面解析“
159 0
|
安全 Java Shell
JDK9特性——模块化&REPL工具
谈到Java9大家往往第一个想到的就是Jigsaw项目(后改名为Modularity)。众所周知,Java已经发展超过20年(95年最初发布),Java和相关生态在不断丰富的同时也越来越暴露出一些问题:
140 0
|
6月前
|
Oracle JavaScript Java
JDK的版本迭代特性(JDK9 - JDK20)
JDK的版本迭代特性(JDK9 - JDK20)
|
编解码 移动开发 Java
JDK9优化了哪些功能以及新增了哪些特性功能|JDK各个版本的特性分析
JDK9优化了哪些功能以及新增了哪些特性功能|JDK各个版本的特性分析
|
存储 运维 算法
从 JDK 9 到 19,认识一个新的 Java 形态(内存篇)
这篇文章是 EDAS 团队的同学在服务客户的过程中,从云原生的角度将相关的功能进行整理和提炼而来。希望能和大家一起认识一个新的 Java 形态。
9290 12
从 JDK 9 到 19,认识一个新的 Java 形态(内存篇)
|
6月前
|
安全 Java 开发者
JDK 9:模块化系统——重新定义Java的模块化架构
JDK 9引入了模块化系统,对Java的模块化架构进行了彻底的重新定义。本文将深入探讨模块化系统的原理、优势以及如何在实际开发中应用这一特性。
|
6月前
|
IDE Java 开发工具
JDK 9:JShell和Jlink——Java开发与部署的新篇章
JDK 9引入了两个强大的新特性:JShell和Jlink,它们为Java开发者和部署带来了巨大的便利。本文将详细介绍这两个特性的原理、优势以及如何在实际开发中应用它们。
|
6月前
|
Java 开发者
JDK 9新特性探秘:接口中的私有方法
本文旨在探讨Java Development Kit 9(JDK 9)为Java接口引入的新特性——私有方法。在JDK 9之前,接口只能包含公共的抽象方法和常量。然而,随着Java的不断发展,接口中需要更加灵活的方式来处理复杂性和代码重用。因此,JDK 9引入了私有方法,允许开发者在接口内部定义私有方法和私有静态方法,从而提高了代码的模块性和可维护性。本文将详细介绍这一新特性的使用方法、应用场景及其对Java编程的影响。
JDK各个版本的特性分析|JDK7|JDK8|JDK9|JDK10|JDK11|JDK12|JDK13特性分析
JDK各个版本的特性分析|JDK7|JDK8|JDK9|JDK10|JDK11|JDK12|JDK13特性分析
|
存储 算法 Java
JDK9之前java对象进入老年代的所有方式
JDK9之前,虚拟机HotSpot的堆被划分为新生代和老年代,新生代中的对象年龄超过15,该对象就会被移入老年代,这种方式也是最常见的一种对象进入老年代的方式,但是对象进入老年代却不止这一种方式,下面总计下对象进入老年代的几种方式
184 0