Java SE 9模块化系统。

JDK 9模块化介绍

    • 介绍
    • Java SE 9:拼图项目
      • 1.拼图项目将引入Java SE 9的全新概念:Java模块系统。
      • 2.Java模块解决了什么问题
      • 3.细节描述
    • Java SE 9模块系统的优点
      • 1.由于Java SE 9将把JDK,JRE,JAR等分成较小的模块,因此我们可以使用所需的任何模块。因此将Java应用程序缩减到小型设备非常容易。
      • API层面介绍
    • Java 9 改进的 @Deprecated 注解
    • 全新的http客户端API
    • Java 9模块系统之母
    • G1垃圾收集器
      • 查看JDK垃圾回收机制的命令
      • Java 9对类加载器的改动
      • 类加载过程
      • 类加载器对比
        • Java 9之前的类加载器层次
        • Java 9之后的类加载器层次

介绍

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

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

img

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进行了拆分为大约71个jmod文件模块左右,每个模块下都会有一个module-info.java文件,它声明了模块的访问方式以及依赖关系。
在这里插入图片描述

在这里插入图片描述

img

Java SE 9模块系统的优点

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

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

API层面介绍

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

[Java中String类型在JDK 8与JDK 11,JDK 17的底层实现变迁 http://t.csdnimg.cn/RfheY]

img编辑

img编辑

// 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连接可以处理多个请求,无需等待上一个请求处理完成,提高响应速度。 [HTTP1.1升级HTTP2.0 http://t.csdnimg.cn/v0HMZ]

Java 9模块系统之母

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

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

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

G1垃圾收集器

G1(Garbage First Collector)是一款面向服务端应用的垃圾收集器,设计用于多核CPU和大容量内存的机器。它的主要特性包括:

  • 目标:在可预测的暂停时间内执行垃圾收集,同时保持高吞吐量。G1通过并行和并发的方式工作,以减少应用程序暂停的时间。
  • 适用场景:G1在JDK 9及更高版本中成为默认的垃圾收集器,取代了CMS收集器。它特别适合现代服务器硬件,如多核处理器和大内存容量。
  • 操作模式:G1将堆空间划分为多个区域(region),每个区域可以独立地进行垃圾回收,而不是整个堆空间一次性进行回收。这样可以更好地控制垃圾回收的暂停时间。

查看JDK垃圾回收机制的命令

虽然 java -XX:+PrintCommandLineFlags -version 可以显示JVM启动时使用的命令行参数,但要查看具体的垃圾收集器配置,更合适的命令是:

  • 使用 -XX:+PrintGCDetails-XX:+PrintGC,并运行一些内存密集型操作,以观察和分析垃圾收集器的行为。

Java 9对类加载器的改动

Java 9引入了模块系统(Jigsaw项目),这改变了类加载器的运作方式。模块系统允许代码和资源被组织成模块,每个模块可以声明对外部模块的依赖关系,以及它公开给外部模块的包。这种变化不仅影响了类路径的结构,也改变了类的查找和加载过程,使得类和资源的管理更加严格和清晰。

类加载过程

类加载过程通常被分为以下几个阶段:

  1. 加载(Loading):读取类的二进制字节流,将其转换为方法区的数据结构,并创建 java.lang.Class 对象。
  2. 验证(Verification):确保字节流符合JVM规范,防止恶意代码。
  3. 准备(Preparation):为类变量分配内存并设置默认值。
  4. 解析(Resolution):将符号引用转换为直接引用。
  5. 初始化(Initialization):执行类构造器 <clinit>() 方法,设置类变量的初始值。

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

img

类加载器对比

Java 9之前的类加载器层次
  1. 引导类加载器(Bootstrap Class Loader):这是JVM内部的类加载器,它加载Java的核心类库(如java.langjava.util等),这些类位于$JAVA_HOME/jre/lib/rt.jar$JAVA_HOME/jre/classes目录下。引导类加载器没有父类加载器,通常表示为null

  2. 扩展类加载器(Extension Class Loader):这个类加载器加载位于$JAVA_HOME/jre/lib/ext目录下的jar文件,也就是扩展库。它的父类加载器是引导类加载器。

  3. 应用类加载器(Application Class Loader):也被称为系统类加载器,负责加载用户应用程序的类,它会从环境变量CLASSPATH指定的位置加载类库。它的父类加载器是扩展类加载器。

Java 9之后的类加载器层次

Java 9引入了模块系统(Jigsaw项目),这改变了类加载器的层次和作用:

  1. 引导类加载器:在Java 9中,核心类库依然由引导类加载器加载,但现在它们被组织成模块。核心模块如java.base由引导类加载器加载。

  2. 平台类加载器:这是Java 9中新增的类加载器,用于加载$JAVA_HOME/jre/lib目录下的非核心模块。这些模块构成了平台模块集,可以由平台类加载器加载。可以通过ClassLoader.getPlatformClassLoader()获取平台类加载器的引用。

  3. 应用或系统类加载器:这个类加载器的作用没有改变,仍然是加载应用程序类路径(CLASSPATH)上的类。然而,现在它也可以加载模块路径(--module-path-p)上的模块。

img

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/782800.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

程序员必知的 89 个操作系统核心概念

1. 操作系统&#xff08;Operating System&#xff0c;OS&#xff09;&#xff1a;是管理计算机硬件与软件资源的系统软件&#xff0c;同时也是计算机系统的内核与基石。操作系统需要处理管理与配置内存、决定系统资源供需的优先次序、控制输入与输出设备、操作网络与管理文件系…

Spring Boot源码概述及应用案例

文章目录 Spring Boot源码关键点应用案例&#xff1a;构建一个简单的Spring Boot Web应用1. 创建项目2. 主类3. 添加用户实体4. 创建用户服务5. 创建REST控制器6. 运行和测试应用 深入与扩展1. 数据持久化2. 安全性增强 Spring Boot源码关键点 Spring Boot 的源码设计遵循模块…

SQLServer的系统数据库用别的服务器上的系统数据库替换后做跨服务器连接时出现凭证、非对称金钥或私密金钥的资料无效

出错作业背景&#xff1a; 公司的某个sqlserver服务器要做迁移&#xff0c;由于该sqlserver服务器上数据库很多&#xff0c;并且做了很多的job和维护计划&#xff0c;重新安装的sqlserver这些都是空的&#xff0c;于是就想到了把系统4个系统数据库进行替换&#xff0c;然后也把…

LeetCode热题100刷题8:54. 螺旋矩阵、73. 矩阵置零、48. 旋转图像

54. 螺旋矩阵 class Solution { public:vector<int> spiralOrder(vector<vector<int>>& matrix) {vector<int> vec;if(matrix.empty())return vec;int left0;int right matrix[0].size()-1;int up0;int down matrix.size()-1;while(true) {for(i…

flask、fastapi在服务器制作接口携参访问返回参数

flask创建接口&#xff1a; 一、安装python 官网下载Download Python | Python.org 二、安装flask 在选择的文件夹路径cmd调用bash安装 pip install Flask三、创建flask应用 # app.py from flask import Flask, request, jsonify app Flask(__name__) app.route(/ech…

如何选择合适的PCB表面处理工艺?

在PCB制造中应用PCB表面处理至关重要&#xff0c;以保护铜迹线不受氧化和环境污染物的侵蚀&#xff0c;这些污染物会降低性能。这些PCB表面处理可以防止水分、灰尘、化学物质和极端温度的侵入&#xff0c;防止PCB材料的腐蚀。它们还有助于在组装过程中有效焊接和粘合&#xff0…

240707_昇思学习打卡-Day19-基于MindSpore通过GPT实现情感分类

240707_昇思学习打卡-Day19-基于MindSpore通过GPT实现情感分类 今天基于GPT实现一个情感分类的功能&#xff0c;假设已经安装好了MindSpore环境。 # 该案例在 mindnlp 0.3.1 版本完成适配&#xff0c;如果发现案例跑不通&#xff0c;可以指定mindnlp版本&#xff0c;执行!pip…

Git 查看、新建、删除、切换分支

Git 是一个版本控制系统&#xff0c;软件开发者用它来跟踪应用程序的变化并进行项目协作。 分支的诞生便于开发人员在彼此独立的环境中进行开发工作。主分支&#xff08;通常是 main 或 master&#xff09;可以保持稳定&#xff0c;而新的功能或修复可以在单独的分支中进行开发…

STM32智能无人机控制系统教程

目录 引言环境准备智能无人机控制系统基础代码实现&#xff1a;实现智能无人机控制系统 4.1 数据采集模块 4.2 数据处理与飞行控制 4.3 通信与导航系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;无人机应用与优化问题解决方案与优化收尾与总结 1. 引言 智能无人机控…

AI工具杂谈

AI是在帮助开发者还是取代他们&#xff1f; 在软件开发领域&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;正在改变开发者的工作方式。无论是代码生成、错误检测还是自动化测试&#xff0c;AI工具正在成为开发者的得力助手。然而&#xff0c;这也引发了对开发者职业…

哪个牌子的护眼大路灯质量好呢?性价比高的五款护眼大路灯分享

护眼大路灯可以说是是每个有娃家庭必不可少的照明神器。但面对市场上琳琅满目的护眼落地灯品牌和型号&#xff0c;很多消费者在选购时都会犯难&#xff1a;究竟哪个牌子的护眼大路灯质量好呢&#xff1f;哪个性价比高呢&#xff1f;本文将根据市场反馈以及性价比等各方面&#…

Table 表格--分页序号自增

代码&#xff1a; import { Space, Table, Tag } from antd; import type { ColumnsType } from antd/es/table; import React, { useState } from react;interface DataType {key: string;name: string;age: number;address: string;tags: string[]; }const data: DataType[]…

6K star! 部署本地运行LLM的AI助手,零基础入门到精通超详细

AI套壳千千万万&#xff0c;你最喜欢哪一款&#xff1f;现在各种ChatGPT替代品层出不穷&#xff0c;但是大部分都是使用OpenAI的API&#xff0c;也就说离不开网络。 今天我们推荐的开源项目它就是要帮你100%在本地运行大模型&#xff0c;进而构建一个属于自己的ChatGPT&#x…

使用 Docker 部署一个文档管理系统,让宝贵文档不在丢失!

大家好,我是CodeQi! 一位热衷于技术分享的码仔。 BookStack 是一个开源的文档管理系统,非常适合用来创建和组织文档。 通过 Docker,我们可以轻松地将 BookStack 部署到本地或服务器上。 本文将详细介绍如何使用 Docker 搭建 BookStack。 项目预览 登录页面

element-plus 的form表单组件之el-radio(单选按钮组件)

单选按钮组件适用于同一组类型的选项只能互斥选择的场景&#xff0c;就是支持单选。单选组件包含以下3个组件 组件名作用el-radio-group单选组组件&#xff0c;子元素可以是el-radio或el-radio-button&#xff0c;v-mode绑定单选组的响应式属性el-radio单选组件&#xff0c;la…

如何确保工业展厅设计既专业又吸引?三原则详解!

工业是民族发展的基石&#xff0c;它为我们带来了无数的便利和进步&#xff0c;而为了让更多人了解这个至关重要的产业&#xff0c;以及其背后的技术和产品&#xff0c;许多工业性质的企业都致力于通过互动投影、虚拟现实、全息投影等多媒体技术&#xff0c;来打造独具特色的工…

起底:Three.js和Cesium.js,二者异同点,好比全科和专科.

Three.js和Cesium.js是两个常用的webGL引擎&#xff0c;很多小伙伴容易把它们搞混淆了&#xff0c;今天威斯数据来详细介绍一下&#xff0c;他们的起源、不同点和共同点&#xff0c;阅读后你就发现二者就像全科医院和专科医院的关系&#xff0c;很好识别。 一、二者的起源 Th…

LiveNVR监控流媒体Onvif/RTSP用户手册-录像回看:录像通道、查看录像、设备录像、云端录像查、时间轴视图、录像分享

LiveNVR监控流媒体Onvif/RTSP用户手册-录像回看:录像通道、查看录像、设备录像、云端录像查、时间轴视图、录像分享 1、录像回看1.1、查看录像1.1.1、时间轴视图1.1.2、列表视图 2、如何分享时间轴录像回看&#xff1f;3、iframe集成示例4、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服…

RabbitMQ(集群相关部署)

RabbitMQ 集群部署 环境准备&#xff1a;阿里云centos8 服务器&#xff0c;3台服务器&#xff0c;分别进行安装&#xff1b; 下载Erlang Erlang和RabbitMQ版本对照&#xff1a;https://www.rabbitmq.com/which-erlang.html 创建yum库配置文件 vim /etc/yum.repos.d/rabbi…

Soong 构建系统

背景 Soong 构建系统在Android 7.0开始引入&#xff0c;目的是取代Make。它利用Kati GNU Make 和Ninja构建系统组件来构建Android Soong是用Go语言写的&#xff0c;go环境在prebuilts/go环境下&#xff0c;Soong在编译时&#xff0c;解析bp文件&#xff0c;转化成Ninja文件&am…