jdk17新特性
JDK17新特性
jdk17下载地址:https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.exe
JDK 17 文档 - 首页 (oracle.com)
垃圾回收器(Z Garbage Collector)
概述
JDK17引入名为ZGC(Z Garbage Collector)是一种低延迟的垃圾回收器。是JDK 11引入的一项实验性功能,并在JDK 15中成为稳定特性。
它旨在减少应用程序的停顿时间,使得即使在大内存堆上也能保持非常短的垃圾收集暂停时间。暂停时间与正在使用的堆大小无关。ZGC支持从8MB到16TB的堆大小。
Z 垃圾回收器使用命令行选项 启用。-XX:+UseZGC
设置堆大小
尽管ZGC在降低停顿时间方面取得了显著的改进,但这并不意味着它适用于所有场景。在某些情况下,特别是对于小内存堆或强调极致吞吐量的应用程序,其他垃圾收集器可能更合适。因此,在选择垃圾收集器时,还需要综合考虑应用程序的性质和需求。
设置并发GC线程数
想要查看的第二个调整选项是 设置并发 GC 线程数 .ZGC具有自动选择此数字的启发式方法。这种启发式方法通常效果很好,但根据应用程序的特征,可能需要进行调整。此选项基本上决定了应该给 GC 多少 CPU 时间。给它太多,GC 将从应用程序中窃取太多的 CPU 时间。给它太少,应用程序分配垃圾的速度可能会快于 GC 收集它的速度。(-XX:ConcGCThreads)
一个清洁器的简单示例。它执行以下操作:
-
定义一个清理操作类,该类 初始化清理操作并定义清洁操作本身(通过 重写方法)。
State``State::run()
-
创建 的实例。
Cleaner
-
使用此实例 ,注册对象和清理操作(的实例)。
Cleaner``myObject1``State
-
确保垃圾回收器安排清理程序和 在示例结束之前执行清理操作, 示例:
State::run()
- 设置为 确保无法访问它。请参阅。
myObject1``null
- 循环中的调用以触发 垃圾回收清理。
- 设置为 确保无法访问它。请参阅。
import java.lang.ref.Cleaner;public class CleanerExample {// This Cleaner is shared by all CleanerExample instancesprivate static final Cleaner CLEANER = Cleaner.create();private final State state;public CleanerExample(String id) {state = new State(id);CLEANER.register(this, state);}// Cleaning action class for CleanerExampleprivate static class State implements Runnable {final private String id;private State(String id) {this.id = id;System.out.println("Created cleaning action for " + this.id);}@Overridepublic void run() {System.out.println("Cleaner garbage collected " + this.id);}}public static void main(String[] args) {CleanerExample myObject1 = new CleanerExample("myObject1");// Make myObject1 unreachablemyObject1 = null;System.out.println("-- Give the GC a chance to schedule the Cleaner --");for (int i = 0; i < 100; i++) {// Calling System.gc() in a loop is usually sufficient to trigger// cleanup in a small program like this.System.gc();try {Thread.sleep(1);} catch (InterruptedException e) {}}System.out.println("-- Finished --");}
}
输出内容
Created cleaning action for myObject1
-- Give the GC a chance to schedule the Cleaner --
Cleaner garbage collected myObject1
-- Finished --
该代码示例演示了Java中的Cleaner类的用法。
Cleaner类是Java 9引入的一个新特性,用于实现在对象被垃圾回收之前执行必要的清理操作。
这段代码定义了一个CleanerExample类,其中包含一个静态的Cleaner实例和一个私有的State内部类,实现了Runnable接口。
在CleanerExample的构造函数中,每次创建实例时都会注册当前对象和其状态(State)到Cleaner中。在State的构造函数中,会打印出创建清理操作的信息。
在main方法中,首先创建了一个CleanerExample实例。然后将myObject1设置为null,使其变得不可达。
接下来,进入一个循环并在循环中调用System.gc(),以尝试手动触发垃圾回收。在每次循环迭代中,通过调用Thread.sleep()来暂停一小段时间,给垃圾回收器调度Cleaner的机会。
最后,程序输出"-- Finished --"表示程序执行结束。
特点
- 低停顿时间:ZGC的主要目标是将垃圾收集暂停时间控制在10毫秒以下,甚至更低。这对于需要快速响应的应用程序和大型内存堆非常重要。
- 回收整个堆:ZGC可以回收整个Java堆,而不仅仅是部分堆区域。这使得它能够处理非常大的内存堆,达到数TB级别。
- 并发垃圾收集:ZGC使用并发线程来执行垃圾收集操作,允许垃圾收集和应用程序执行同时进行,从而减少了停顿时间。
- 基于读屏障:ZGC使用了一种基于读屏障(Read Barrier)的技术,来记录对象引用的读取操作,以便在并发清除过程中保证引用的正确性。
- 可伸缩性:ZGC在设计上注重可伸缩性,能够适应不同规模的应用程序和硬件环境,并能够充分利用多核处理器。
注意: 尽管ZGC在降低停顿时间方面取得了显著的改进,但这并不意味着它适用于所有场景。在某些情况下,特别是对于小内存堆或强调极致吞吐量的应用程序,其他垃圾收集器可能更合适。因此,在选择垃圾收集器时,还需要综合考虑应用程序的性质和需求。
Switch表达式
在Java 14和Java 15中,已经引入了Switch表达式的初始版本。而在JDK 17中,Switch表达式得到了一些改进和增强,包括以下新特性:
-
简化的Switch表达式:在JDK 17中,可以使用简化的Switch表达式来替代传统的Switch语句。这意味着Switch表达式可以像其他表达式一样返回一个值,无需使用break语句,并且每个分支只需要使用"->"符号来分隔条件和代码块。
示例:
int dayOfWeek = 5; String dayType = switch (dayOfWeek) {case 1, 2, 3, 4, 5 -> "工作日";case 6, 7 -> "休息日";default -> throw new IllegalArgumentException("无效的星期"); }; System.out.println(dayType); // 输出:工作日
jdk8编写
int dayOfWeek = 5; String dayType; switch (dayOfWeek) {case 1:case 2:case 3:case 4:case 5:dayType = "工作日";break;case 6:case 7:dayType = "休息日";break;default:throw new IllegalArgumentException("无效的星期"); } System.out.println(dayType); // 输出:无效的星期
-
新增的Pattern匹配:在JDK 17中,Switch表达式还支持对Pattern进行匹配。这使得我们可以使用Switch表达式来处理更复杂的模式匹配操作,例如对类型、枚举常量等进行匹配。
示例:
Object obj = "Hello"; int length = switch (obj) {case String s -> s.length();case Integer i && i > 0 -> i;case int[] arr && arr.length > 0 -> arr.length;default -> -1; }; System.out.println(length); // 输出:5
jdk8编写
Object obj = "Hello"; int length; if (obj instanceof String) {String s = (String) obj;length = s.length(); } else if (obj instanceof Integer && ((Integer) obj) > 0) {int i = (Integer) obj;length = i; } else if (obj instanceof int[] && ((int[]) obj).length > 0) {int[] arr = (int[]) obj;length = arr.length; } else {length = -1; } System.out.println(length); // 输出:5
-
简化的Lambda类型:在JDK 17中,Switch表达式还支持使用"->"符号来指定Lambda表达式的类型。这使得我们可以更简洁地定义Switch表达式中的Lambda表达式。
示例:
int number = 4; String numberType = switch (number) {case 1 -> "One";case 2 -> "Two";case 3 -> "Three";default -> {yield "Other";} }; System.out.println(numberType); // 输出:Other
jdk8编写
int number = 4;
String numberType;
switch (number) {case 1:numberType = "One";break;case 2:numberType = "Two";break;case 3:numberType = "Three";break;default:numberType = "Other";break;
}
System.out.println(numberType); // 输出:Other
Switch表达式的新特性需要Java 17或更高版本才能使用。并且在使用Switch表达式时,仍然需要确保每个分支都能够处理所有可能的情况,否则需要在最后添加default分支来处理未匹配到的情况。
sealed关键字
原文:
概述
sealed 类是 JDK 17 中引入的一个新特性,它通过控制类的直接子类来提供更严格的类继承关系,并对类层次结构进行限制。这有助于提高代码的可读性和可维护性,并在特定领域建模中非常有用。它通过控制类的直接子类来提供更严格的类继承关系,并对类层次结构进行限制。这有助于提高代码的可读性和可维护性,并在特定领域建模中非常有用。
例如:
public sealed class Student permits StudentSon1, StudentSon2 {// 父类定义的共享属性和方法
}final class StudentSon1 extends Student {// 圆形特定的属性和方法
}final class StudentSon2 extends Student {// 矩形特定的属性和方法
}
解释:
通过sealed关键字定义的Student类,只能被permits关键字列出的StudentSon1,StudentSon2类来继承,其他类无法直接继承Student类,负责编译错误
这样的设计有助于受限制继承关系,使得只有特定的StudentSon1和StudentSon2来继承Student父类。
这种模式可以在建模特定领域或实现特定抽象时非常有用,因为它能提供更严格的类层次结构,增加代码的可读性和可维护性。
特点
- 当一个类被声明为sealed类时,这意味着在声明这个类时已经知道了它的所有直接子类,并且不希望或需要有其他直接子类。这种对类直接子类的明确和详尽控制在用类层次来建模领域中的值类型时非常有用,而不仅仅是作为代码继承和重用的机制。直接子类本身也可以声明为sealed类,以进一步控制类层次结构。
- 一个类可以被声明为final类,如果该类的定义已经完整,不希望或需要有任何子类。final类永远不会有任何子类,因此final类的方法也不会被覆盖。
- 如果一个类有一个sealed的直接超类或者一个sealed的直接超接口,而且没有明确或隐式地声明为final、sealed或non-sealed,那么这将是一个编译时错误。
permits关键字
permits 是用于定义一个 sealed 类的子类集合的关键字。在一个 sealed 类的声明中,可以使用 permits 关键字来列出一组允许的子类,这些子类可以继承该 sealed 类。
当一个类被声明为 sealed 类时,它必须显式列出其所允许的所有直接子类。这个列表通过使用 permits 关键字来定义,其后跟随该 sealed 类所允许的子类名称或类型。例如:
public sealed class Animal permits Cat, Dog, Fish {// 类主体
}
Animal 是一个 sealed 类,它允许的子类分别是 Cat、Dog 和 Fish。
需要注意的是,使用 permits 关键字列出的子类必须是 sealed 类、final 类或 non-sealed 类。如果不是这些类型之一,那么会出现编译时错误。
permits 是 Java 中用于定义 sealed 类的允许子类集合的关键字,它可以帮助开发人员更加精确地控制类的继承关系,提高代码的可读性和可维护性。
原文:
/*
定义一个sealed类,在permits列表中出现编译错误p.B
正确的写法是使用完整的包名前缀,例如 package.B
sealed class A 表示类 A 是一个 sealed 类,但由于permits列表中的子句错误,代码无法通过编译。
*/
sealed class A permits B, C, p.B {} // error
//类 B 是一个非 sealed 类,它继承自类 A。由于 A 是 sealed 类,所以 B 可以作为 A 的子类进行扩展。
non-sealed class B extends A {}
//类 C 是一个非 sealed 类,也继承自类 A。与类 B 一样,C 作为 A 的子类进行扩展。
non-sealed class C extends A {}
相关文章:
jdk17新特性
JDK17新特性 jdk17下载地址:https://download.oracle.com/java/17/latest/jdk-17_windows-x64_bin.exe JDK 17 文档 - 首页 (oracle.com) 垃圾回收器(Z Garbage Collector) 概述 JDK17引入名为ZGC(Z Garbage Collector&#x…...
爬虫项目(四):抓取网页所有图片
文章目录 一、书籍推荐二、完整代码三、运行结果 一、书籍推荐 推荐本人书籍《Python网络爬虫入门到实战》 ,详细介绍见👉: 《Python网络爬虫入门到实战》 书籍介绍 二、完整代码 原理:抓取该链接中所有的图片格式。基于seleni…...
短剧推广和小说推文在哪里授权介绍
短剧推广和小说推文都属于很热门的赛道,都可以通过“巨量推文”进行授权 在巨量推文找到想推广的小说或者短剧后申请推广即可,小说需要有回填作品信息,短剧为全自动,出数据后实时同步到平台...
Java:本地文件通过表单参数接口发送后大小变成0
问题 发现一个文件生成以后,如果不通过接口发送,大小就正常,通过接口发送,文件大小就变成0了,发送的文件也是0 空文件 代码 MultiValueMap<String, Object> form new LinkedMultiValueMap<>();FileSyst…...
Linux 共享内存
#include <sys/ipc.h> #include <sys/shm.h> int shmget(key_t key, size_t size, int shmflg);功能:创建一个新的内存段或者获得一个既有的共享内存段的标识。新创建的内存段中的数据都会被初始化为0参数:-key:key_t类型是一个整…...
druid在springboot中如何整合配置!
在Spring Boot中配置Druid作为数据源非常简单。Druid是一个高性能的数据库连接池,它提供了丰富的监控和统计功能,适用于各种数据库。以下是在Spring Boot中配置Druid数据源的步骤: 1. 添加Druid依赖: 首先,您需要在项…...
数据结构:栈
文章目录 栈一,概述二,添加数据三,删除数据 栈 一,概述 栈(Stack)是一种特殊的线性表,它只允许在一端进行插入和删除操作,通常被称为“后进先出”(Last In First Out&a…...
每日刷题-6
目录 一、选择题 二、算法题 1.Fibonacci数列 2.合法括号序列判断 一、选择题 1、 解析:内联函数是一种可以提高函数执行效率的方法,它的原理是编译时在函数调用点直接展开函数体的代码,从而避免了函数调用的开销。 但是,内联函…...
systrace使用注意事项
打开systrace文件报错:Unable to select a master clock domain because no path can be found from “SYSTRACE” to “LINUX_FTRACE_GLOBAL”. 使用systrace生成的trace.html文件无法打开,或者报上面的错误,可以选择下面这个方式࿱…...
RockyLinux9.2 网卡配置和nmcli、nmtui命令的使用
NetworkManager NetworkManager 是一个标准的Linux网络配置工具套件,支持服务器,也支持桌面环境, 发展到如今,绝大多数流行的发行版都支持它。 这套网络配置工具适用于 Rocky Linux 8 及更高版本。 nmcli是nm的命令行工具、nmt…...
Java线程池ThreadPoolExecutor应用(Spring Boot微服务)
记录:475 场景:在Spring Boot微服务中使用Java线程池ThreadPoolExecutor。实现Runnable接口提交线程任务到线程池。 版本:JDK 1.8,Spring Boot 2.6.3。 1.使用注解配置线程池ThreadPoolExecutor (1)说明 ThreadPoolExecutor,…...
QT5|C++|通过信号槽机制实现进度条更新
背景:最近在写一个删除90天数据显示进度的功能,实现思路是:通过信号槽捕获当前进度值实现。 备注:点击start按钮,开始更新进度条,直到100(每隔1s进行更新)举个栗子: 1、…...
什么是智能推荐?智能推荐的原理是什么?
一、智能推荐的魔力 2020年的愚人节晚间,罗永浩在抖音带货,相信你也被刷屏了吧。3小时的直播过程中,22款产品轮番出场,最终首播支付交易总额突破1.1亿、整场直播观看总人数超过4800万、总销售件数逾91万,粉丝打赏音浪…...
Windows下的Elasticsearch-head安装
Windows下的Elasticsearch-head安装 参考:https://gitcode.net/mirrors/mobz/elasticsearch-head 需要用到 npm 命令,这里可以提前下载安装下Node.js 即可自动安装npm; Node.js 下载安装地址:https://nodejs.org/en/download # 进…...
两台服务器间进行文件传输
目录 方法1:使用SCP 方法2:使用rsync 使用SSH密钥 两台服务器之间进行文件传输通常可以使用SCP(Secure Copy Protocol)或rsync命令。这两种方法都是在UNIX和Linux系统上常用的工具,用于安全地复制文件和目录。以下是…...
研究生选控制嵌入式还是机器视觉好?
研究生选控制嵌入式还是机器视觉好? 我是嵌入式/硬件方向转的算法,现在是公司的算法负责人,如果再让我选一次,我是不会再选嵌入式方 向,嵌入式如果只做技术是没前途的。 你要是有一定自学能力,能自己在学校…...
SecureCRT SSH与FTP连接中文乱码
1、首先要保证服务端环境变量是UTF-8编码的 LANG”zh_CN.UTF-8″ 2、会话里面配置好字符编码:UTF-8 SSH会话的窗口就可以正常显示中文了,效果如下 3、打开FTP或者SFTP时进行文件传输时,列表窗口里面还是乱码,需要把SecureCRT安…...
OSI七层网络参考模型与数据流通过程
OSI七层网络参考模型 文章目录 OSI七层网络参考模型1. OSI参考模型初步了解2. OSI参考模型理解3. 数据流通的过程 1. OSI参考模型初步了解 OSI,英文为Open System Interconnect,意为开放式系统互连,国际化标准组织(ISO)指定了OSI模型&#x…...
数字孪生行业相关政策梳理--工业领域相关政策(可下载)
自2021年国家“十四五”规划纲要提出“探索建设数字孪生城市”以来,国家发展和改革委员会、工业和信息化部、住房和城乡建设部、水利部、农业农村部等部门纷纷出台政策,大力推动数字孪生在千行百业的落地发展。这些政策不仅为数字孪生的应用提供了广阔的…...
【工具】咸鱼之王辅助小助手来了!
自动答题的视频演示:【工具】咸鱼之王辅助小助手来了!_哔哩哔哩_bilibili 刚开始搞,还没来得及做界面,目前只做了自动答题。 欢迎感兴趣的大佬一起来开发~...
黑马JVM总结(十)
(1)直接内存_基本使用 下面我们看一下使用了ByteBuffer直接内存,大文件的读写效率是非常的高 Java本身并不具备磁盘读写的能力,它需要调用操作系统的函数,需要从java的方法内部调用本地方法操作系统的方法,…...
JPEG、GIF动图可以转换成SVG、Eps格式的矢量图吗?
在进行图片设计的过程中,我们可能需要很多不同格式的图片,例如 JPG、PNG、BMP 和 GIF 位图图像,怎么将这些图片转换成矢量图呢?一款功能强大的应用程序,能够轻松将位图图片转换成矢量图输出。Vector Magic会帮你进行自…...
数据结构与算法的力量:编写更高效的代码
文章目录 为什么数据结构和算法重要?1. 提高性能2. 节省资源3. 解决复杂问题4. 改进代码质量 常见数据结构和算法数据结构1. 数组(Array)2. 链表(Linked List)3. 栈(Stack)4. 队列(Q…...
Python批量统计pdf中“中文”字符的个数
之前的文章提供了批量识别pdf中英文的方法,详见【python爬虫】批量识别pdf中的英文,自动翻译成中文上。以及自动pdf英文转中文文档,详见【python爬虫】批量识别pdf中的英文,自动翻译成中文下。以及Python统计pdf中英文单词的个数。 本文实现Python统计pdf中中文字符的…...
LeetCode的第 363 场周赛——记录+补题
研究生生涯第一次打力扣周赛——3题 1. 计算 K 置位下标对应元素的和 class Solution { public:int cnt(int x){int sum 0;while (x) {sum ((x%2)?1:0);x/2;}return sum;}int sumIndicesWithKSetBits(vector<int>& nums, int k) {int n nums.size();int ans 0…...
【网络协议】Http-上
Http请求结构: 结构图1: 实验解析请求报文: 1.在Edge浏览器上输入ip地址端口号文件资源,也就是下图中的120.XX.139.29:8888/A/B/c.html 2.我的程序接收到了一个没有有效载荷的http请求(呼应上面的结构图1),如下 GET …...
Langchain-chatchat本地部署
Langchain-chatchat本地部署 参考官网 环境配置 conda安装 minicoda下载地址 安装时注意勾选上添加环境变量。安装完成之后使用conda --version测试一下版本。 环境创建 先配置一下conda的镜像地址(使用阿里的靠谱一些),这里要修改一下…...
SQL故障和排查解决浅析
MySQL长连接 MySQL长连接是指应用程序与MySQL数据库之间的连接在执行完一个操作后不会立即关闭,而是保持活动状态以供后续使用。这种连接模式在某些情况下可以提高性能,但也可能导致一些问题。以下是MySQL长连接的一些现象和排查方法: 现象…...
基础算法--双指针算法
双指针算法 1.基本介绍 严格的来说,双指针只能说是是算法中的一种技巧。 双指针指的是在遍历对象的过程中,不是普通的使用单个指针进行访问,而是使用两个相同方向(快慢指针)或者相反方向(对撞指针&#…...
企业工程项目管理系统源码(三控:进度组织、质量安全、预算资金成本、二平台:招采、设计管理)
工程项目管理软件(工程项目管理系统)对建设工程项目管理组织建设、项目策划决策、规划设计、施工建设到竣工交付、总结评估、运维运营,全过程、全方位的对项目进行综合管理 工程项目各模块及其功能点清单 一、系统管理 1、数据字典&am…...
备案变更网站/安卓手机优化软件排名
记录一下自己安装VS2010与Opencv的配置过程,方便以后查看使用,开发环境的搭建: 1. 下载安装Opencv,去官网http://opencv.org/即可下载最新版本的Opencv,此处用的是Opencv 2.4.10 安装时傻瓜式的,最新版本的…...
上海青浦区网站建设公司/谷歌下载
random库是使用随机数的python标准库。 伪随机数:采用梅森旋转算法生产的伪随机数列中元素 random库主要用于生成随机数基本随机数函数 随机数种子相同的种子生成的随机数是相同的,可以复现结果。 扩展随机数函数例 圆周率的计算 蒙特卡洛方法from rando…...
北京推广网站/广州市新闻发布
2019独角兽企业重金招聘Python工程师标准>>> 1.停止mysql服务 2.转至mysql安装目录的 bin 目录下 3.运行 mysqld --skip-grant-tables 4.新开cmd窗口,直接输入 mysql 然后不输入密码回车. 5.use mysql; 6.更新密码 update user set passwordpasswor…...
免费ppt模板下载百度云/seo关键词优化方法
>>回到总目录<< 为了不辜负已经订阅了专栏的同学们的信任,所以本专栏不会有任何的优惠活动。 另外,当订阅人数每次达到 2 n ( n > 2 ) 2^n(n>2) 2...
新网 网站建立/杭州关键词优化服务
要知道 富不出三代,穷不过几年的事情并不是很多,甚至可以说很少很少, 更多时候,铁的现实是: 富人的孩子还是富人,穷人的孩子还是穷人。 大家不可能站在同一起跑线,最终也不大可能站到同一终点线上。 很多时候, 你的终点只是别人的起点! 王思聪他爸…...
移动网站建设厂家/广告推广语
尽管win10系统已经出了有一段时间,但还是有不少用户还在使用win7系统。大家连接的无线都是由路由器放出的,其实电脑也可以的,那么电脑如何改造成无线路由器?下面我们就一起来看看windows7电脑改成无线路由器是怎么操作的。win7电脑…...