Latest commit

History

History
130 lines (86 loc) · 7.21 KB

File metadata and controls

130 lines (86 loc) · 7.21 KB
titleJava 10 新特性概览
description概览 JDK 10 的主要更新,重点介绍 var 类型推断与其他平台改进。
categoryJava
tag
Java新特性
head
meta
namecontent
keywords
Java 10,JDK10,var 局部变量类型推断,垃圾回收改进,性能

Java 10 发布于 2018 年 3 月 20 日,这是一个非 LTS(长期支持)版本,Oracle 仅提供六个月的支持。

下图是从 JDK 8 到 JDK 25 每个版本的更新带来的新特性数量和更新时间:

 JDK 8 到 JDK 25 每个版本的更新带来的新特性数量和更新时间

这篇文章会挑选其中较为重要的一些新特性进行详细介绍:

JEP 286: Local-Variable Type Inference

由于太多 Java 开发者希望 Java 中引入局部变量类型推断,于是 Java 10 的时候它来了,也算是众望所归了!

Java 10 提供了 var 关键字声明局部变量。

varid = 0;
varcodefx = newURL("https://mp.weixin.qq.com/");
varlist = newArrayList<>();
varlist = List.of(1, 2, 3);
varmap = newHashMap<String, String>();
varp = Paths.of("src/test/java/Java9FeaturesTest.java");
varnumbers = List.of("a", "b", "c");
for (varn : numbers)
System.out.print(n+ " ");

var 关键字只能用于带有构造器的局部变量和 for 循环中。

varcount = null; //❌编译不通过,不能声明为 nullvarr = () -> Math.random();//❌编译不通过,不能声明为 Lambda表达式vararray = {1, 2, 3};//❌编译不通过,不能声明数组

var 并不会改变 Java 是一门静态类型语言的事实,编译器负责推断出类型。

另外,Scala 和 Kotlin 中已经有了 val 关键字 ( final var 组合关键字)。

JEP 304: Garbage-Collector Interface

在早期的 JDK 结构中,组成垃圾收集器 (GC) 实现的组件分散在代码库的各个部分。 Java 10 通过引入一套纯净的垃圾收集器接口来将不同垃圾收集器的源代码分隔开。

JEP 307: Parallel Full GC for G1

从 Java 9 开始 G1 就成了默认的垃圾回收器,G1 是以一种低延时的垃圾回收器来设计的,旨在避免进行 Full GC,但是 Java 9 的 G1 的 Full GC 依然是使用单线程去完成标记清除算法,这可能会导致垃圾回收器在无法回收内存的时候触发 Full GC。

为了最大限度地减少 Full GC 造成的应用停顿的影响,从 Java10 开始,G1 的 FullGC 改为并行的标记清除算法,同时会使用与年轻代回收和混合回收相同的并行工作线程数量,从而减少了 Full GC 的发生,以带来更好的性能提升、更大的吞吐量。

JEP 310: 应用程序类数据共享(扩展 CDS 功能)

在 Java 5 中就已经引入了类数据共享机制 (Class Data Sharing,简称 CDS),允许将一组类预处理为共享归档文件,以便在运行时能够进行内存映射以减少 Java 程序的启动时间,当多个 Java 虚拟机(JVM)共享相同的归档文件时,还可以减少动态内存的占用量,同时减少多个虚拟机在同一个物理或虚拟的机器上运行时的资源占用。CDS 在当时还是 Oracle JDK 的商业特性。

Java 10 在现有的 CDS 功能基础上再次拓展,以允许应用类放置在共享存档中。CDS 特性在原来的 bootstrap 类基础之上,扩展加入了应用类的 CDS 为 (Application Class-Data Sharing,AppCDS) 支持,大大加大了 CDS 的适用范围。其原理为:在启动时记录加载类的过程,写入到文本文件中,再次启动时直接读取此启动文本并加载。设想如果应用环境没有大的变化,启动速度就会得到提升。

JEP 317: 实验性的基于 Java 的 JIT 编译器

Graal 是一个基于 Java 语言编写的 JIT 编译器,是 JDK 9 中引入的实验性 Ahead-of-Time (AOT) 编译器的基础。

Oracle 的 HotSpot VM 便附带两个用 C++ 实现的 JIT compiler:C1 及 C2。在 Java 10 (Linux/x64, macOS/x64) 中,默认情况下 HotSpot 仍使用 C2,但通过向 java 命令添加 -XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler 参数便可将 C2 替换成 Graal。

API 增强

并不是所有的 API 改动都会通过 JEP(Java Enhancement Proposal)来发布。

在 JDK 的开发流程中:JEP 通常用于重大的改变,例如引入新的语言特性(如 var)、新的 JVM 机制(如 ZGC)或者大规模的库重构。像 List.copyOf() 这种在现有类中增加几个静态方法的操作,通常被视为常规的库维护。它们由 JDK 开发者直接通过 JBS (JDK Bug System) 的工单(Ticket)进行提交和评审,然后随版本直接发布。

集合增强

ListSetMap 提供了静态方法copyOf()返回入参集合的一个不可变拷贝。

static <E> List<E> copyOf(Collection<? extendsE> coll) {
returnImmutableCollections.listCopy(coll);
}

使用 copyOf() 创建的集合为不可变集合,不能进行添加、删除、替换、 排序等操作,不然会报 java.lang.UnsupportedOperationException 异常。 IDEA 也会有相应的提示。

使用 copyOf() 创建的集合为不可变集合

并且,java.util.stream.Collectors 中新增了静态方法,用于将流中的元素收集为不可变的集合。

varlist = newArrayList<>();
list.stream().collect(Collectors.toUnmodifiableList());
list.stream().collect(Collectors.toUnmodifiableSet());

Optional 增强

Optional 新增了一个无参的 orElseThrow() 方法,作为带参数的 orElseThrow(Supplier<? extends X> exceptionSupplier) 的简化版本,在没有值时默认抛出一个 NoSuchElementException 异常。

Optional<String> optional = Optional.empty();
Stringresult = optional.orElseThrow();

其他

  • 线程-局部管控:Java 10 中线程管控引入 JVM 安全点的概念,将允许在不运行全局 JVM 安全点的情况下实现线程回调,由线程本身或者 JVM 线程来执行,同时保持线程处于阻塞状态,这种方式使得停止单个线程变成可能,而不是只能启用或停止所有线程
  • 备用存储装置上的堆分配:Java 10 中将使得 JVM 能够使用适用于不同类型的存储机制的堆,在可选内存设备上进行堆内存分配
  • ……

参考

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Latest commit

History

History
130 lines (86 loc) · 7.21 KB

File metadata and controls

130 lines (86 loc) · 7.21 KB
titleJava 10 新特性概览
description概览 JDK 10 的主要更新,重点介绍 var 类型推断与其他平台改进。
categoryJava
tag
Java新特性
head
meta
namecontent
keywords
Java 10,JDK10,var 局部变量类型推断,垃圾回收改进,性能

Java 10 发布于 2018 年 3 月 20 日,这是一个非 LTS(长期支持)版本,Oracle 仅提供六个月的支持。

下图是从 JDK 8 到 JDK 25 每个版本的更新带来的新特性数量和更新时间:

 JDK 8 到 JDK 25 每个版本的更新带来的新特性数量和更新时间

这篇文章会挑选其中较为重要的一些新特性进行详细介绍:

JEP 286: Local-Variable Type Inference

由于太多 Java 开发者希望 Java 中引入局部变量类型推断,于是 Java 10 的时候它来了,也算是众望所归了!

Java 10 提供了 var 关键字声明局部变量。

varid = 0;
varcodefx = newURL("https://mp.weixin.qq.com/");
varlist = newArrayList<>();
varlist = List.of(1, 2, 3);
varmap = newHashMap<String, String>();
varp = Paths.of("src/test/java/Java9FeaturesTest.java");
varnumbers = List.of("a", "b", "c");
for (varn : numbers)
System.out.print(n+ " ");

var 关键字只能用于带有构造器的局部变量和 for 循环中。

varcount = null; //❌编译不通过,不能声明为 nullvarr = () -> Math.random();//❌编译不通过,不能声明为 Lambda表达式vararray = {1, 2, 3};//❌编译不通过,不能声明数组

var 并不会改变 Java 是一门静态类型语言的事实,编译器负责推断出类型。

另外,Scala 和 Kotlin 中已经有了 val 关键字 ( final var 组合关键字)。

JEP 304: Garbage-Collector Interface

在早期的 JDK 结构中,组成垃圾收集器 (GC) 实现的组件分散在代码库的各个部分。 Java 10 通过引入一套纯净的垃圾收集器接口来将不同垃圾收集器的源代码分隔开。

JEP 307: Parallel Full GC for G1

从 Java 9 开始 G1 就成了默认的垃圾回收器,G1 是以一种低延时的垃圾回收器来设计的,旨在避免进行 Full GC,但是 Java 9 的 G1 的 Full GC 依然是使用单线程去完成标记清除算法,这可能会导致垃圾回收器在无法回收内存的时候触发 Full GC。

为了最大限度地减少 Full GC 造成的应用停顿的影响,从 Java10 开始,G1 的 FullGC 改为并行的标记清除算法,同时会使用与年轻代回收和混合回收相同的并行工作线程数量,从而减少了 Full GC 的发生,以带来更好的性能提升、更大的吞吐量。

JEP 310: 应用程序类数据共享(扩展 CDS 功能)

在 Java 5 中就已经引入了类数据共享机制 (Class Data Sharing,简称 CDS),允许将一组类预处理为共享归档文件,以便在运行时能够进行内存映射以减少 Java 程序的启动时间,当多个 Java 虚拟机(JVM)共享相同的归档文件时,还可以减少动态内存的占用量,同时减少多个虚拟机在同一个物理或虚拟的机器上运行时的资源占用。CDS 在当时还是 Oracle JDK 的商业特性。

Java 10 在现有的 CDS 功能基础上再次拓展,以允许应用类放置在共享存档中。CDS 特性在原来的 bootstrap 类基础之上,扩展加入了应用类的 CDS 为 (Application Class-Data Sharing,AppCDS) 支持,大大加大了 CDS 的适用范围。其原理为:在启动时记录加载类的过程,写入到文本文件中,再次启动时直接读取此启动文本并加载。设想如果应用环境没有大的变化,启动速度就会得到提升。

JEP 317: 实验性的基于 Java 的 JIT 编译器

Graal 是一个基于 Java 语言编写的 JIT 编译器,是 JDK 9 中引入的实验性 Ahead-of-Time (AOT) 编译器的基础。

Oracle 的 HotSpot VM 便附带两个用 C++ 实现的 JIT compiler:C1 及 C2。在 Java 10 (Linux/x64, macOS/x64) 中,默认情况下 HotSpot 仍使用 C2,但通过向 java 命令添加 -XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler 参数便可将 C2 替换成 Graal。

API 增强

并不是所有的 API 改动都会通过 JEP(Java Enhancement Proposal)来发布。

在 JDK 的开发流程中:JEP 通常用于重大的改变,例如引入新的语言特性(如 var)、新的 JVM 机制(如 ZGC)或者大规模的库重构。像 List.copyOf() 这种在现有类中增加几个静态方法的操作,通常被视为常规的库维护。它们由 JDK 开发者直接通过 JBS (JDK Bug System) 的工单(Ticket)进行提交和评审,然后随版本直接发布。

集合增强

ListSetMap 提供了静态方法copyOf()返回入参集合的一个不可变拷贝。

static <E> List<E> copyOf(Collection<? extendsE> coll) {
returnImmutableCollections.listCopy(coll);
}

使用 copyOf() 创建的集合为不可变集合,不能进行添加、删除、替换、 排序等操作,不然会报 java.lang.UnsupportedOperationException 异常。 IDEA 也会有相应的提示。

使用 copyOf() 创建的集合为不可变集合

并且,java.util.stream.Collectors 中新增了静态方法,用于将流中的元素收集为不可变的集合。

varlist = newArrayList<>();
list.stream().collect(Collectors.toUnmodifiableList());
list.stream().collect(Collectors.toUnmodifiableSet());

Optional 增强

Optional 新增了一个无参的 orElseThrow() 方法,作为带参数的 orElseThrow(Supplier<? extends X> exceptionSupplier) 的简化版本,在没有值时默认抛出一个 NoSuchElementException 异常。

Optional<String> optional = Optional.empty();
Stringresult = optional.orElseThrow();

其他

  • 线程-局部管控:Java 10 中线程管控引入 JVM 安全点的概念,将允许在不运行全局 JVM 安全点的情况下实现线程回调,由线程本身或者 JVM 线程来执行,同时保持线程处于阻塞状态,这种方式使得停止单个线程变成可能,而不是只能启用或停止所有线程
  • 备用存储装置上的堆分配:Java 10 中将使得 JVM 能够使用适用于不同类型的存储机制的堆,在可选内存设备上进行堆内存分配
  • ……

参考

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History
130 lines (86 loc) · 7.21 KB

File metadata and controls

130 lines (86 loc) · 7.21 KB
titleJava 10 新特性概览
description概览 JDK 10 的主要更新,重点介绍 var 类型推断与其他平台改进。
categoryJava
tag
Java新特性
head
meta
namecontent
keywords
Java 10,JDK10,var 局部变量类型推断,垃圾回收改进,性能

Java 10 发布于 2018 年 3 月 20 日,这是一个非 LTS(长期支持)版本,Oracle 仅提供六个月的支持。

下图是从 JDK 8 到 JDK 25 每个版本的更新带来的新特性数量和更新时间:

 JDK 8 到 JDK 25 每个版本的更新带来的新特性数量和更新时间

这篇文章会挑选其中较为重要的一些新特性进行详细介绍:

JEP 286: Local-Variable Type Inference

由于太多 Java 开发者希望 Java 中引入局部变量类型推断,于是 Java 10 的时候它来了,也算是众望所归了!

Java 10 提供了 var 关键字声明局部变量。

varid = 0;
varcodefx = newURL("https://mp.weixin.qq.com/");
varlist = newArrayList<>();
varlist = List.of(1, 2, 3);
varmap = newHashMap<String, String>();
varp = Paths.of("src/test/java/Java9FeaturesTest.java");
varnumbers = List.of("a", "b", "c");
for (varn : numbers)
System.out.print(n+ " ");

var 关键字只能用于带有构造器的局部变量和 for 循环中。

varcount = null; //❌编译不通过,不能声明为 nullvarr = () -> Math.random();//❌编译不通过,不能声明为 Lambda表达式vararray = {1, 2, 3};//❌编译不通过,不能声明数组

var 并不会改变 Java 是一门静态类型语言的事实,编译器负责推断出类型。

另外,Scala 和 Kotlin 中已经有了 val 关键字 ( final var 组合关键字)。

JEP 304: Garbage-Collector Interface

在早期的 JDK 结构中,组成垃圾收集器 (GC) 实现的组件分散在代码库的各个部分。 Java 10 通过引入一套纯净的垃圾收集器接口来将不同垃圾收集器的源代码分隔开。

JEP 307: Parallel Full GC for G1

从 Java 9 开始 G1 就成了默认的垃圾回收器,G1 是以一种低延时的垃圾回收器来设计的,旨在避免进行 Full GC,但是 Java 9 的 G1 的 Full GC 依然是使用单线程去完成标记清除算法,这可能会导致垃圾回收器在无法回收内存的时候触发 Full GC。

为了最大限度地减少 Full GC 造成的应用停顿的影响,从 Java10 开始,G1 的 FullGC 改为并行的标记清除算法,同时会使用与年轻代回收和混合回收相同的并行工作线程数量,从而减少了 Full GC 的发生,以带来更好的性能提升、更大的吞吐量。

JEP 310: 应用程序类数据共享(扩展 CDS 功能)

在 Java 5 中就已经引入了类数据共享机制 (Class Data Sharing,简称 CDS),允许将一组类预处理为共享归档文件,以便在运行时能够进行内存映射以减少 Java 程序的启动时间,当多个 Java 虚拟机(JVM)共享相同的归档文件时,还可以减少动态内存的占用量,同时减少多个虚拟机在同一个物理或虚拟的机器上运行时的资源占用。CDS 在当时还是 Oracle JDK 的商业特性。

Java 10 在现有的 CDS 功能基础上再次拓展,以允许应用类放置在共享存档中。CDS 特性在原来的 bootstrap 类基础之上,扩展加入了应用类的 CDS 为 (Application Class-Data Sharing,AppCDS) 支持,大大加大了 CDS 的适用范围。其原理为:在启动时记录加载类的过程,写入到文本文件中,再次启动时直接读取此启动文本并加载。设想如果应用环境没有大的变化,启动速度就会得到提升。

JEP 317: 实验性的基于 Java 的 JIT 编译器

Graal 是一个基于 Java 语言编写的 JIT 编译器,是 JDK 9 中引入的实验性 Ahead-of-Time (AOT) 编译器的基础。

Oracle 的 HotSpot VM 便附带两个用 C++ 实现的 JIT compiler:C1 及 C2。在 Java 10 (Linux/x64, macOS/x64) 中,默认情况下 HotSpot 仍使用 C2,但通过向 java 命令添加 -XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler 参数便可将 C2 替换成 Graal。

API 增强

并不是所有的 API 改动都会通过 JEP(Java Enhancement Proposal)来发布。

在 JDK 的开发流程中:JEP 通常用于重大的改变,例如引入新的语言特性(如 var)、新的 JVM 机制(如 ZGC)或者大规模的库重构。像 List.copyOf() 这种在现有类中增加几个静态方法的操作,通常被视为常规的库维护。它们由 JDK 开发者直接通过 JBS (JDK Bug System) 的工单(Ticket)进行提交和评审,然后随版本直接发布。

集合增强

ListSetMap 提供了静态方法copyOf()返回入参集合的一个不可变拷贝。

static <E> List<E> copyOf(Collection<? extendsE> coll) {
returnImmutableCollections.listCopy(coll);
}

使用 copyOf() 创建的集合为不可变集合,不能进行添加、删除、替换、 排序等操作,不然会报 java.lang.UnsupportedOperationException 异常。 IDEA 也会有相应的提示。

使用 copyOf() 创建的集合为不可变集合

并且,java.util.stream.Collectors 中新增了静态方法,用于将流中的元素收集为不可变的集合。

varlist = newArrayList<>();
list.stream().collect(Collectors.toUnmodifiableList());
list.stream().collect(Collectors.toUnmodifiableSet());

Optional 增强

Optional 新增了一个无参的 orElseThrow() 方法,作为带参数的 orElseThrow(Supplier<? extends X> exceptionSupplier) 的简化版本,在没有值时默认抛出一个 NoSuchElementException 异常。

Optional<String> optional = Optional.empty();
Stringresult = optional.orElseThrow();

其他

  • 线程-局部管控:Java 10 中线程管控引入 JVM 安全点的概念,将允许在不运行全局 JVM 安全点的情况下实现线程回调,由线程本身或者 JVM 线程来执行,同时保持线程处于阻塞状态,这种方式使得停止单个线程变成可能,而不是只能启用或停止所有线程
  • 备用存储装置上的堆分配:Java 10 中将使得 JVM 能够使用适用于不同类型的存储机制的堆,在可选内存设备上进行堆内存分配
  • ……

参考

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History
130 lines (86 loc) · 7.21 KB

File metadata and controls

130 lines (86 loc) · 7.21 KB
titleJava 10 新特性概览
description概览 JDK 10 的主要更新,重点介绍 var 类型推断与其他平台改进。
categoryJava
tag
Java新特性
head
meta
namecontent
keywords
Java 10,JDK10,var 局部变量类型推断,垃圾回收改进,性能

Java 10 发布于 2018 年 3 月 20 日,这是一个非 LTS(长期支持)版本,Oracle 仅提供六个月的支持。

下图是从 JDK 8 到 JDK 25 每个版本的更新带来的新特性数量和更新时间:

 JDK 8 到 JDK 25 每个版本的更新带来的新特性数量和更新时间

这篇文章会挑选其中较为重要的一些新特性进行详细介绍:

JEP 286: Local-Variable Type Inference

由于太多 Java 开发者希望 Java 中引入局部变量类型推断,于是 Java 10 的时候它来了,也算是众望所归了!

Java 10 提供了 var 关键字声明局部变量。

varid = 0;
varcodefx = newURL("https://mp.weixin.qq.com/");
varlist = newArrayList<>();
varlist = List.of(1, 2, 3);
varmap = newHashMap<String, String>();
varp = Paths.of("src/test/java/Java9FeaturesTest.java");
varnumbers = List.of("a", "b", "c");
for (varn : numbers)
System.out.print(n+ " ");

var 关键字只能用于带有构造器的局部变量和 for 循环中。

varcount = null; //❌编译不通过,不能声明为 nullvarr = () -> Math.random();//❌编译不通过,不能声明为 Lambda表达式vararray = {1, 2, 3};//❌编译不通过,不能声明数组

var 并不会改变 Java 是一门静态类型语言的事实,编译器负责推断出类型。

另外,Scala 和 Kotlin 中已经有了 val 关键字 ( final var 组合关键字)。

JEP 304: Garbage-Collector Interface

在早期的 JDK 结构中,组成垃圾收集器 (GC) 实现的组件分散在代码库的各个部分。 Java 10 通过引入一套纯净的垃圾收集器接口来将不同垃圾收集器的源代码分隔开。

JEP 307: Parallel Full GC for G1

从 Java 9 开始 G1 就成了默认的垃圾回收器,G1 是以一种低延时的垃圾回收器来设计的,旨在避免进行 Full GC,但是 Java 9 的 G1 的 Full GC 依然是使用单线程去完成标记清除算法,这可能会导致垃圾回收器在无法回收内存的时候触发 Full GC。

为了最大限度地减少 Full GC 造成的应用停顿的影响,从 Java10 开始,G1 的 FullGC 改为并行的标记清除算法,同时会使用与年轻代回收和混合回收相同的并行工作线程数量,从而减少了 Full GC 的发生,以带来更好的性能提升、更大的吞吐量。

JEP 310: 应用程序类数据共享(扩展 CDS 功能)

在 Java 5 中就已经引入了类数据共享机制 (Class Data Sharing,简称 CDS),允许将一组类预处理为共享归档文件,以便在运行时能够进行内存映射以减少 Java 程序的启动时间,当多个 Java 虚拟机(JVM)共享相同的归档文件时,还可以减少动态内存的占用量,同时减少多个虚拟机在同一个物理或虚拟的机器上运行时的资源占用。CDS 在当时还是 Oracle JDK 的商业特性。

Java 10 在现有的 CDS 功能基础上再次拓展,以允许应用类放置在共享存档中。CDS 特性在原来的 bootstrap 类基础之上,扩展加入了应用类的 CDS 为 (Application Class-Data Sharing,AppCDS) 支持,大大加大了 CDS 的适用范围。其原理为:在启动时记录加载类的过程,写入到文本文件中,再次启动时直接读取此启动文本并加载。设想如果应用环境没有大的变化,启动速度就会得到提升。

JEP 317: 实验性的基于 Java 的 JIT 编译器

Graal 是一个基于 Java 语言编写的 JIT 编译器,是 JDK 9 中引入的实验性 Ahead-of-Time (AOT) 编译器的基础。

Oracle 的 HotSpot VM 便附带两个用 C++ 实现的 JIT compiler:C1 及 C2。在 Java 10 (Linux/x64, macOS/x64) 中,默认情况下 HotSpot 仍使用 C2,但通过向 java 命令添加 -XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler 参数便可将 C2 替换成 Graal。

API 增强

并不是所有的 API 改动都会通过 JEP(Java Enhancement Proposal)来发布。

在 JDK 的开发流程中:JEP 通常用于重大的改变,例如引入新的语言特性(如 var)、新的 JVM 机制(如 ZGC)或者大规模的库重构。像 List.copyOf() 这种在现有类中增加几个静态方法的操作,通常被视为常规的库维护。它们由 JDK 开发者直接通过 JBS (JDK Bug System) 的工单(Ticket)进行提交和评审,然后随版本直接发布。

集合增强

ListSetMap 提供了静态方法copyOf()返回入参集合的一个不可变拷贝。

static <E> List<E> copyOf(Collection<? extendsE> coll) {
returnImmutableCollections.listCopy(coll);
}

使用 copyOf() 创建的集合为不可变集合,不能进行添加、删除、替换、 排序等操作,不然会报 java.lang.UnsupportedOperationException 异常。 IDEA 也会有相应的提示。

使用 copyOf() 创建的集合为不可变集合

并且,java.util.stream.Collectors 中新增了静态方法,用于将流中的元素收集为不可变的集合。

varlist = newArrayList<>();
list.stream().collect(Collectors.toUnmodifiableList());
list.stream().collect(Collectors.toUnmodifiableSet());

Optional 增强

Optional 新增了一个无参的 orElseThrow() 方法,作为带参数的 orElseThrow(Supplier<? extends X> exceptionSupplier) 的简化版本,在没有值时默认抛出一个 NoSuchElementException 异常。

Optional<String> optional = Optional.empty();
Stringresult = optional.orElseThrow();

其他

  • 线程-局部管控:Java 10 中线程管控引入 JVM 安全点的概念,将允许在不运行全局 JVM 安全点的情况下实现线程回调,由线程本身或者 JVM 线程来执行,同时保持线程处于阻塞状态,这种方式使得停止单个线程变成可能,而不是只能启用或停止所有线程
  • 备用存储装置上的堆分配:Java 10 中将使得 JVM 能够使用适用于不同类型的存储机制的堆,在可选内存设备上进行堆内存分配
  • ……

参考

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Latest commit

History

History
130 lines (86 loc) · 7.21 KB

File metadata and controls

130 lines (86 loc) · 7.21 KB
titleJava 10 新特性概览
description概览 JDK 10 的主要更新,重点介绍 var 类型推断与其他平台改进。
categoryJava
tag
Java新特性
head
meta
namecontent
keywords
Java 10,JDK10,var 局部变量类型推断,垃圾回收改进,性能

Java 10 发布于 2018 年 3 月 20 日,这是一个非 LTS(长期支持)版本,Oracle 仅提供六个月的支持。

下图是从 JDK 8 到 JDK 25 每个版本的更新带来的新特性数量和更新时间:

 JDK 8 到 JDK 25 每个版本的更新带来的新特性数量和更新时间

这篇文章会挑选其中较为重要的一些新特性进行详细介绍:

JEP 286: Local-Variable Type Inference

由于太多 Java 开发者希望 Java 中引入局部变量类型推断,于是 Java 10 的时候它来了,也算是众望所归了!

Java 10 提供了 var 关键字声明局部变量。

varid = 0;
varcodefx = newURL("https://mp.weixin.qq.com/");
varlist = newArrayList<>();
varlist = List.of(1, 2, 3);
varmap = newHashMap<String, String>();
varp = Paths.of("src/test/java/Java9FeaturesTest.java");
varnumbers = List.of("a", "b", "c");
for (varn : numbers)
System.out.print(n+ " ");

var 关键字只能用于带有构造器的局部变量和 for 循环中。

varcount = null; //❌编译不通过,不能声明为 nullvarr = () -> Math.random();//❌编译不通过,不能声明为 Lambda表达式vararray = {1, 2, 3};//❌编译不通过,不能声明数组

var 并不会改变 Java 是一门静态类型语言的事实,编译器负责推断出类型。

另外,Scala 和 Kotlin 中已经有了 val 关键字 ( final var 组合关键字)。

JEP 304: Garbage-Collector Interface

在早期的 JDK 结构中,组成垃圾收集器 (GC) 实现的组件分散在代码库的各个部分。 Java 10 通过引入一套纯净的垃圾收集器接口来将不同垃圾收集器的源代码分隔开。

JEP 307: Parallel Full GC for G1

从 Java 9 开始 G1 就成了默认的垃圾回收器,G1 是以一种低延时的垃圾回收器来设计的,旨在避免进行 Full GC,但是 Java 9 的 G1 的 Full GC 依然是使用单线程去完成标记清除算法,这可能会导致垃圾回收器在无法回收内存的时候触发 Full GC。

为了最大限度地减少 Full GC 造成的应用停顿的影响,从 Java10 开始,G1 的 FullGC 改为并行的标记清除算法,同时会使用与年轻代回收和混合回收相同的并行工作线程数量,从而减少了 Full GC 的发生,以带来更好的性能提升、更大的吞吐量。

JEP 310: 应用程序类数据共享(扩展 CDS 功能)

在 Java 5 中就已经引入了类数据共享机制 (Class Data Sharing,简称 CDS),允许将一组类预处理为共享归档文件,以便在运行时能够进行内存映射以减少 Java 程序的启动时间,当多个 Java 虚拟机(JVM)共享相同的归档文件时,还可以减少动态内存的占用量,同时减少多个虚拟机在同一个物理或虚拟的机器上运行时的资源占用。CDS 在当时还是 Oracle JDK 的商业特性。

Java 10 在现有的 CDS 功能基础上再次拓展,以允许应用类放置在共享存档中。CDS 特性在原来的 bootstrap 类基础之上,扩展加入了应用类的 CDS 为 (Application Class-Data Sharing,AppCDS) 支持,大大加大了 CDS 的适用范围。其原理为:在启动时记录加载类的过程,写入到文本文件中,再次启动时直接读取此启动文本并加载。设想如果应用环境没有大的变化,启动速度就会得到提升。

JEP 317: 实验性的基于 Java 的 JIT 编译器

Graal 是一个基于 Java 语言编写的 JIT 编译器,是 JDK 9 中引入的实验性 Ahead-of-Time (AOT) 编译器的基础。

Oracle 的 HotSpot VM 便附带两个用 C++ 实现的 JIT compiler:C1 及 C2。在 Java 10 (Linux/x64, macOS/x64) 中,默认情况下 HotSpot 仍使用 C2,但通过向 java 命令添加 -XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler 参数便可将 C2 替换成 Graal。

API 增强

并不是所有的 API 改动都会通过 JEP(Java Enhancement Proposal)来发布。

在 JDK 的开发流程中:JEP 通常用于重大的改变,例如引入新的语言特性(如 var)、新的 JVM 机制(如 ZGC)或者大规模的库重构。像 List.copyOf() 这种在现有类中增加几个静态方法的操作,通常被视为常规的库维护。它们由 JDK 开发者直接通过 JBS (JDK Bug System) 的工单(Ticket)进行提交和评审,然后随版本直接发布。

集合增强

ListSetMap 提供了静态方法copyOf()返回入参集合的一个不可变拷贝。

static <E> List<E> copyOf(Collection<? extendsE> coll) {
returnImmutableCollections.listCopy(coll);
}

使用 copyOf() 创建的集合为不可变集合,不能进行添加、删除、替换、 排序等操作,不然会报 java.lang.UnsupportedOperationException 异常。 IDEA 也会有相应的提示。

使用 copyOf() 创建的集合为不可变集合

并且,java.util.stream.Collectors 中新增了静态方法,用于将流中的元素收集为不可变的集合。

varlist = newArrayList<>();
list.stream().collect(Collectors.toUnmodifiableList());
list.stream().collect(Collectors.toUnmodifiableSet());

Optional 增强

Optional 新增了一个无参的 orElseThrow() 方法,作为带参数的 orElseThrow(Supplier<? extends X> exceptionSupplier) 的简化版本,在没有值时默认抛出一个 NoSuchElementException 异常。

Optional<String> optional = Optional.empty();
Stringresult = optional.orElseThrow();

其他

  • 线程-局部管控:Java 10 中线程管控引入 JVM 安全点的概念,将允许在不运行全局 JVM 安全点的情况下实现线程回调,由线程本身或者 JVM 线程来执行,同时保持线程处于阻塞状态,这种方式使得停止单个线程变成可能,而不是只能启用或停止所有线程
  • 备用存储装置上的堆分配:Java 10 中将使得 JVM 能够使用适用于不同类型的存储机制的堆,在可选内存设备上进行堆内存分配
  • ……

参考

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History
130 lines (86 loc) · 7.21 KB

File metadata and controls

130 lines (86 loc) · 7.21 KB
titleJava 10 新特性概览
description概览 JDK 10 的主要更新,重点介绍 var 类型推断与其他平台改进。
categoryJava
tag
Java新特性
head
meta
namecontent
keywords
Java 10,JDK10,var 局部变量类型推断,垃圾回收改进,性能

Java 10 发布于 2018 年 3 月 20 日,这是一个非 LTS(长期支持)版本,Oracle 仅提供六个月的支持。

下图是从 JDK 8 到 JDK 25 每个版本的更新带来的新特性数量和更新时间:

 JDK 8 到 JDK 25 每个版本的更新带来的新特性数量和更新时间

这篇文章会挑选其中较为重要的一些新特性进行详细介绍:

JEP 286: Local-Variable Type Inference

由于太多 Java 开发者希望 Java 中引入局部变量类型推断,于是 Java 10 的时候它来了,也算是众望所归了!

Java 10 提供了 var 关键字声明局部变量。

varid = 0;
varcodefx = newURL("https://mp.weixin.qq.com/");
varlist = newArrayList<>();
varlist = List.of(1, 2, 3);
varmap = newHashMap<String, String>();
varp = Paths.of("src/test/java/Java9FeaturesTest.java");
varnumbers = List.of("a", "b", "c");
for (varn : numbers)
System.out.print(n+ " ");

var 关键字只能用于带有构造器的局部变量和 for 循环中。

varcount = null; //❌编译不通过,不能声明为 nullvarr = () -> Math.random();//❌编译不通过,不能声明为 Lambda表达式vararray = {1, 2, 3};//❌编译不通过,不能声明数组

var 并不会改变 Java 是一门静态类型语言的事实,编译器负责推断出类型。

另外,Scala 和 Kotlin 中已经有了 val 关键字 ( final var 组合关键字)。

JEP 304: Garbage-Collector Interface

在早期的 JDK 结构中,组成垃圾收集器 (GC) 实现的组件分散在代码库的各个部分。 Java 10 通过引入一套纯净的垃圾收集器接口来将不同垃圾收集器的源代码分隔开。

JEP 307: Parallel Full GC for G1

从 Java 9 开始 G1 就成了默认的垃圾回收器,G1 是以一种低延时的垃圾回收器来设计的,旨在避免进行 Full GC,但是 Java 9 的 G1 的 Full GC 依然是使用单线程去完成标记清除算法,这可能会导致垃圾回收器在无法回收内存的时候触发 Full GC。

为了最大限度地减少 Full GC 造成的应用停顿的影响,从 Java10 开始,G1 的 FullGC 改为并行的标记清除算法,同时会使用与年轻代回收和混合回收相同的并行工作线程数量,从而减少了 Full GC 的发生,以带来更好的性能提升、更大的吞吐量。

JEP 310: 应用程序类数据共享(扩展 CDS 功能)

在 Java 5 中就已经引入了类数据共享机制 (Class Data Sharing,简称 CDS),允许将一组类预处理为共享归档文件,以便在运行时能够进行内存映射以减少 Java 程序的启动时间,当多个 Java 虚拟机(JVM)共享相同的归档文件时,还可以减少动态内存的占用量,同时减少多个虚拟机在同一个物理或虚拟的机器上运行时的资源占用。CDS 在当时还是 Oracle JDK 的商业特性。

Java 10 在现有的 CDS 功能基础上再次拓展,以允许应用类放置在共享存档中。CDS 特性在原来的 bootstrap 类基础之上,扩展加入了应用类的 CDS 为 (Application Class-Data Sharing,AppCDS) 支持,大大加大了 CDS 的适用范围。其原理为:在启动时记录加载类的过程,写入到文本文件中,再次启动时直接读取此启动文本并加载。设想如果应用环境没有大的变化,启动速度就会得到提升。

JEP 317: 实验性的基于 Java 的 JIT 编译器

Graal 是一个基于 Java 语言编写的 JIT 编译器,是 JDK 9 中引入的实验性 Ahead-of-Time (AOT) 编译器的基础。

Oracle 的 HotSpot VM 便附带两个用 C++ 实现的 JIT compiler:C1 及 C2。在 Java 10 (Linux/x64, macOS/x64) 中,默认情况下 HotSpot 仍使用 C2,但通过向 java 命令添加 -XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler 参数便可将 C2 替换成 Graal。

API 增强

并不是所有的 API 改动都会通过 JEP(Java Enhancement Proposal)来发布。

在 JDK 的开发流程中:JEP 通常用于重大的改变,例如引入新的语言特性(如 var)、新的 JVM 机制(如 ZGC)或者大规模的库重构。像 List.copyOf() 这种在现有类中增加几个静态方法的操作,通常被视为常规的库维护。它们由 JDK 开发者直接通过 JBS (JDK Bug System) 的工单(Ticket)进行提交和评审,然后随版本直接发布。

集合增强

ListSetMap 提供了静态方法copyOf()返回入参集合的一个不可变拷贝。

static <E> List<E> copyOf(Collection<? extendsE> coll) {
returnImmutableCollections.listCopy(coll);
}

使用 copyOf() 创建的集合为不可变集合,不能进行添加、删除、替换、 排序等操作,不然会报 java.lang.UnsupportedOperationException 异常。 IDEA 也会有相应的提示。

使用 copyOf() 创建的集合为不可变集合

并且,java.util.stream.Collectors 中新增了静态方法,用于将流中的元素收集为不可变的集合。

varlist = newArrayList<>();
list.stream().collect(Collectors.toUnmodifiableList());
list.stream().collect(Collectors.toUnmodifiableSet());

Optional 增强

Optional 新增了一个无参的 orElseThrow() 方法,作为带参数的 orElseThrow(Supplier<? extends X> exceptionSupplier) 的简化版本,在没有值时默认抛出一个 NoSuchElementException 异常。

Optional<String> optional = Optional.empty();
Stringresult = optional.orElseThrow();

其他

  • 线程-局部管控:Java 10 中线程管控引入 JVM 安全点的概念,将允许在不运行全局 JVM 安全点的情况下实现线程回调,由线程本身或者 JVM 线程来执行,同时保持线程处于阻塞状态,这种方式使得停止单个线程变成可能,而不是只能启用或停止所有线程
  • 备用存储装置上的堆分配:Java 10 中将使得 JVM 能够使用适用于不同类型的存储机制的堆,在可选内存设备上进行堆内存分配
  • ……

参考

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Latest commit

History

History
130 lines (86 loc) · 7.21 KB

File metadata and controls

130 lines (86 loc) · 7.21 KB
titleJava 10 新特性概览
description概览 JDK 10 的主要更新,重点介绍 var 类型推断与其他平台改进。
categoryJava
tag
Java新特性
head
meta
namecontent
keywords
Java 10,JDK10,var 局部变量类型推断,垃圾回收改进,性能

Java 10 发布于 2018 年 3 月 20 日,这是一个非 LTS(长期支持)版本,Oracle 仅提供六个月的支持。

下图是从 JDK 8 到 JDK 25 每个版本的更新带来的新特性数量和更新时间:

 JDK 8 到 JDK 25 每个版本的更新带来的新特性数量和更新时间

这篇文章会挑选其中较为重要的一些新特性进行详细介绍:

JEP 286: Local-Variable Type Inference

由于太多 Java 开发者希望 Java 中引入局部变量类型推断,于是 Java 10 的时候它来了,也算是众望所归了!

Java 10 提供了 var 关键字声明局部变量。

varid = 0;
varcodefx = newURL("https://mp.weixin.qq.com/");
varlist = newArrayList<>();
varlist = List.of(1, 2, 3);
varmap = newHashMap<String, String>();
varp = Paths.of("src/test/java/Java9FeaturesTest.java");
varnumbers = List.of("a", "b", "c");
for (varn : numbers)
System.out.print(n+ " ");

var 关键字只能用于带有构造器的局部变量和 for 循环中。

varcount = null; //❌编译不通过,不能声明为 nullvarr = () -> Math.random();//❌编译不通过,不能声明为 Lambda表达式vararray = {1, 2, 3};//❌编译不通过,不能声明数组

var 并不会改变 Java 是一门静态类型语言的事实,编译器负责推断出类型。

另外,Scala 和 Kotlin 中已经有了 val 关键字 ( final var 组合关键字)。

JEP 304: Garbage-Collector Interface

在早期的 JDK 结构中,组成垃圾收集器 (GC) 实现的组件分散在代码库的各个部分。 Java 10 通过引入一套纯净的垃圾收集器接口来将不同垃圾收集器的源代码分隔开。

JEP 307: Parallel Full GC for G1

从 Java 9 开始 G1 就成了默认的垃圾回收器,G1 是以一种低延时的垃圾回收器来设计的,旨在避免进行 Full GC,但是 Java 9 的 G1 的 Full GC 依然是使用单线程去完成标记清除算法,这可能会导致垃圾回收器在无法回收内存的时候触发 Full GC。

为了最大限度地减少 Full GC 造成的应用停顿的影响,从 Java10 开始,G1 的 FullGC 改为并行的标记清除算法,同时会使用与年轻代回收和混合回收相同的并行工作线程数量,从而减少了 Full GC 的发生,以带来更好的性能提升、更大的吞吐量。

JEP 310: 应用程序类数据共享(扩展 CDS 功能)

在 Java 5 中就已经引入了类数据共享机制 (Class Data Sharing,简称 CDS),允许将一组类预处理为共享归档文件,以便在运行时能够进行内存映射以减少 Java 程序的启动时间,当多个 Java 虚拟机(JVM)共享相同的归档文件时,还可以减少动态内存的占用量,同时减少多个虚拟机在同一个物理或虚拟的机器上运行时的资源占用。CDS 在当时还是 Oracle JDK 的商业特性。

Java 10 在现有的 CDS 功能基础上再次拓展,以允许应用类放置在共享存档中。CDS 特性在原来的 bootstrap 类基础之上,扩展加入了应用类的 CDS 为 (Application Class-Data Sharing,AppCDS) 支持,大大加大了 CDS 的适用范围。其原理为:在启动时记录加载类的过程,写入到文本文件中,再次启动时直接读取此启动文本并加载。设想如果应用环境没有大的变化,启动速度就会得到提升。

JEP 317: 实验性的基于 Java 的 JIT 编译器

Graal 是一个基于 Java 语言编写的 JIT 编译器,是 JDK 9 中引入的实验性 Ahead-of-Time (AOT) 编译器的基础。

Oracle 的 HotSpot VM 便附带两个用 C++ 实现的 JIT compiler:C1 及 C2。在 Java 10 (Linux/x64, macOS/x64) 中,默认情况下 HotSpot 仍使用 C2,但通过向 java 命令添加 -XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler 参数便可将 C2 替换成 Graal。

API 增强

并不是所有的 API 改动都会通过 JEP(Java Enhancement Proposal)来发布。

在 JDK 的开发流程中:JEP 通常用于重大的改变,例如引入新的语言特性(如 var)、新的 JVM 机制(如 ZGC)或者大规模的库重构。像 List.copyOf() 这种在现有类中增加几个静态方法的操作,通常被视为常规的库维护。它们由 JDK 开发者直接通过 JBS (JDK Bug System) 的工单(Ticket)进行提交和评审,然后随版本直接发布。

集合增强

ListSetMap 提供了静态方法copyOf()返回入参集合的一个不可变拷贝。

static <E> List<E> copyOf(Collection<? extendsE> coll) {
returnImmutableCollections.listCopy(coll);
}

使用 copyOf() 创建的集合为不可变集合,不能进行添加、删除、替换、 排序等操作,不然会报 java.lang.UnsupportedOperationException 异常。 IDEA 也会有相应的提示。

使用 copyOf() 创建的集合为不可变集合

并且,java.util.stream.Collectors 中新增了静态方法,用于将流中的元素收集为不可变的集合。

varlist = newArrayList<>();
list.stream().collect(Collectors.toUnmodifiableList());
list.stream().collect(Collectors.toUnmodifiableSet());

Optional 增强

Optional 新增了一个无参的 orElseThrow() 方法,作为带参数的 orElseThrow(Supplier<? extends X> exceptionSupplier) 的简化版本,在没有值时默认抛出一个 NoSuchElementException 异常。

Optional<String> optional = Optional.empty();
Stringresult = optional.orElseThrow();

其他

  • 线程-局部管控:Java 10 中线程管控引入 JVM 安全点的概念,将允许在不运行全局 JVM 安全点的情况下实现线程回调,由线程本身或者 JVM 线程来执行,同时保持线程处于阻塞状态,这种方式使得停止单个线程变成可能,而不是只能启用或停止所有线程
  • 备用存储装置上的堆分配:Java 10 中将使得 JVM 能够使用适用于不同类型的存储机制的堆,在可选内存设备上进行堆内存分配
  • ……

参考

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Latest commit

History

History
130 lines (86 loc) · 7.21 KB

File metadata and controls

130 lines (86 loc) · 7.21 KB
titleJava 10 新特性概览
description概览 JDK 10 的主要更新,重点介绍 var 类型推断与其他平台改进。
categoryJava
tag
Java新特性
head
meta
namecontent
keywords
Java 10,JDK10,var 局部变量类型推断,垃圾回收改进,性能

Java 10 发布于 2018 年 3 月 20 日,这是一个非 LTS(长期支持)版本,Oracle 仅提供六个月的支持。

下图是从 JDK 8 到 JDK 25 每个版本的更新带来的新特性数量和更新时间:

 JDK 8 到 JDK 25 每个版本的更新带来的新特性数量和更新时间

这篇文章会挑选其中较为重要的一些新特性进行详细介绍:

JEP 286: Local-Variable Type Inference

由于太多 Java 开发者希望 Java 中引入局部变量类型推断,于是 Java 10 的时候它来了,也算是众望所归了!

Java 10 提供了 var 关键字声明局部变量。

varid = 0;
varcodefx = newURL("https://mp.weixin.qq.com/");
varlist = newArrayList<>();
varlist = List.of(1, 2, 3);
varmap = newHashMap<String, String>();
varp = Paths.of("src/test/java/Java9FeaturesTest.java");
varnumbers = List.of("a", "b", "c");
for (varn : numbers)
System.out.print(n+ " ");

var 关键字只能用于带有构造器的局部变量和 for 循环中。

varcount = null; //❌编译不通过,不能声明为 nullvarr = () -> Math.random();//❌编译不通过,不能声明为 Lambda表达式vararray = {1, 2, 3};//❌编译不通过,不能声明数组

var 并不会改变 Java 是一门静态类型语言的事实,编译器负责推断出类型。

另外,Scala 和 Kotlin 中已经有了 val 关键字 ( final var 组合关键字)。

JEP 304: Garbage-Collector Interface

在早期的 JDK 结构中,组成垃圾收集器 (GC) 实现的组件分散在代码库的各个部分。 Java 10 通过引入一套纯净的垃圾收集器接口来将不同垃圾收集器的源代码分隔开。

JEP 307: Parallel Full GC for G1

从 Java 9 开始 G1 就成了默认的垃圾回收器,G1 是以一种低延时的垃圾回收器来设计的,旨在避免进行 Full GC,但是 Java 9 的 G1 的 Full GC 依然是使用单线程去完成标记清除算法,这可能会导致垃圾回收器在无法回收内存的时候触发 Full GC。

为了最大限度地减少 Full GC 造成的应用停顿的影响,从 Java10 开始,G1 的 FullGC 改为并行的标记清除算法,同时会使用与年轻代回收和混合回收相同的并行工作线程数量,从而减少了 Full GC 的发生,以带来更好的性能提升、更大的吞吐量。

JEP 310: 应用程序类数据共享(扩展 CDS 功能)

在 Java 5 中就已经引入了类数据共享机制 (Class Data Sharing,简称 CDS),允许将一组类预处理为共享归档文件,以便在运行时能够进行内存映射以减少 Java 程序的启动时间,当多个 Java 虚拟机(JVM)共享相同的归档文件时,还可以减少动态内存的占用量,同时减少多个虚拟机在同一个物理或虚拟的机器上运行时的资源占用。CDS 在当时还是 Oracle JDK 的商业特性。

Java 10 在现有的 CDS 功能基础上再次拓展,以允许应用类放置在共享存档中。CDS 特性在原来的 bootstrap 类基础之上,扩展加入了应用类的 CDS 为 (Application Class-Data Sharing,AppCDS) 支持,大大加大了 CDS 的适用范围。其原理为:在启动时记录加载类的过程,写入到文本文件中,再次启动时直接读取此启动文本并加载。设想如果应用环境没有大的变化,启动速度就会得到提升。

JEP 317: 实验性的基于 Java 的 JIT 编译器

Graal 是一个基于 Java 语言编写的 JIT 编译器,是 JDK 9 中引入的实验性 Ahead-of-Time (AOT) 编译器的基础。

Oracle 的 HotSpot VM 便附带两个用 C++ 实现的 JIT compiler:C1 及 C2。在 Java 10 (Linux/x64, macOS/x64) 中,默认情况下 HotSpot 仍使用 C2,但通过向 java 命令添加 -XX:+UnlockExperimentalVMOptions -XX:+UseJVMCICompiler 参数便可将 C2 替换成 Graal。

API 增强

并不是所有的 API 改动都会通过 JEP(Java Enhancement Proposal)来发布。

在 JDK 的开发流程中:JEP 通常用于重大的改变,例如引入新的语言特性(如 var)、新的 JVM 机制(如 ZGC)或者大规模的库重构。像 List.copyOf() 这种在现有类中增加几个静态方法的操作,通常被视为常规的库维护。它们由 JDK 开发者直接通过 JBS (JDK Bug System) 的工单(Ticket)进行提交和评审,然后随版本直接发布。

集合增强

ListSetMap 提供了静态方法copyOf()返回入参集合的一个不可变拷贝。

static <E> List<E> copyOf(Collection<? extendsE> coll) {
returnImmutableCollections.listCopy(coll);
}

使用 copyOf() 创建的集合为不可变集合,不能进行添加、删除、替换、 排序等操作,不然会报 java.lang.UnsupportedOperationException 异常。 IDEA 也会有相应的提示。

使用 copyOf() 创建的集合为不可变集合

并且,java.util.stream.Collectors 中新增了静态方法,用于将流中的元素收集为不可变的集合。

varlist = newArrayList<>();
list.stream().collect(Collectors.toUnmodifiableList());
list.stream().collect(Collectors.toUnmodifiableSet());

Optional 增强

Optional 新增了一个无参的 orElseThrow() 方法,作为带参数的 orElseThrow(Supplier<? extends X> exceptionSupplier) 的简化版本,在没有值时默认抛出一个 NoSuchElementException 异常。

Optional<String> optional = Optional.empty();
Stringresult = optional.orElseThrow();

其他

  • 线程-局部管控:Java 10 中线程管控引入 JVM 安全点的概念,将允许在不运行全局 JVM 安全点的情况下实现线程回调,由线程本身或者 JVM 线程来执行,同时保持线程处于阻塞状态,这种方式使得停止单个线程变成可能,而不是只能启用或停止所有线程
  • 备用存储装置上的堆分配:Java 10 中将使得 JVM 能够使用适用于不同类型的存储机制的堆,在可选内存设备上进行堆内存分配
  • ……

参考