MySQL高可用之主备同步:展望未来,JDK-12的新特性

前言

JDK12目前已经发布了,而我估计大部分人还在用Jdk8,但做程序开发的必须向前(钱)看,我们来看看JDK12到底能给我们带来一些什么新的改变。

从JDK10到JDK11,再到JDK12。JDK 12显然是这些变化中新增功能最少的版本,但少并不意味着弱鸡,接下来我们将从Java语法 、类库、JVM来具体分析。

Java语法

我认为JDK 12中最突出的新功能是切换表达式:

在JDK 12之前,switch是一个声明语句,在使用的时候,你需要给他一个合适的定义。

在JDK 12中,switch已成为一个表达式,可以很快的编写并生成结果。 同时很重要的一点是有很好的兼容性,因此您不需要更改使用switch作为语句的任何代码。

示例如下:

我们将从星期一到星期天的英文单词列出并计算出每一个单词的长度,并且把该长度分配给numLetters 变量。

JDK12以前的写法:

int numLetters;
switch (day) {
   case MONDAY:
   case FRIDAY:
   case SUNDAY:
       numLetters = 6;
       break;
   case TUESDAY:
       numLetters = 7;
       break;
   case THURSDAY:
   case SATURDAY:
       numLetters = 8;
       break;
   case WEDNESDAY:
       numLetters = 9;
       break;
   default:
       throw new IllegalStateException("Huh? " + day);
}

JDK12中的写法:

int numLetters = switch (day) {
   case MONDAY, FRIDAY, SUNDAY -> 6;
   case TUESDAY -> 7;
   case THURSDAY, SATURDAY -> 8;
   case WEDNESDAY -> 9;
   default -> throw new IllegalStateException("Huh? " + day);
};

JDK12中极大的简化了switch的写法。同时使用Lambda表达式运算符->来简化我们的处理。

类库

流处理

Streams中的API有一个新的收集器,由Collectors类提供。 可以使用teeing()方法获得新的收集器。 teeing()方法有三个参数:两个Collectors 和一个BiFunction。如下图:

输入流中的所有值都将传递到每个Collectors 中。 每个Collectors 的结果作为参数传递给BiFunction并生成最终结果。

示例就是计算平均值的例子

/* Assume Collectors is statically imported */
double average = Stream.of(1, 4, 2, 7, 4, 6, 5)
    .collect(teeing(
        summingDouble(i -> i), 
        counting(),
        (sum, n) -> sum / n));

第一个Collectors 计算输入流的总和,而第二个Collectors 计算元素的数量。 BiFunction将总和除以元素计数以评估平均值。

java.io

InputStream skipNBytes(long n)

以上代码会跳过输入流中n个字节的数据。 如果n<=0,则不跳过任何字节。

java.text中

有一个新类CompactNumberFormat 。 这是NumberFormat的子类 以紧凑的形式格式化十进制数。

紧凑形式的一个例子是将1,000,000写为1M,因此代码中只需要2个而不是9个字符。

JVM

一个低暂停时间的垃圾收集器

新增了一个名为 Shenandoah 的 GC 算法,通过与正在运行的 Java 线程同时进行垃圾收集工作来减少 GC 暂停时间。

G1 垃圾收集器的改进(G1的暂停时间最大的值的控制目标)

G1将堆空间(年轻代和老年代)划分成区域。 这样的做法是老年代可以在一次GC中不需要进行垃圾收集。 当G1需要收集时,它会选择它确定需要收集的区域。 这称为collection set集合集) 。 在JDK 12之前,一旦在collection set集合集)上开始工作,那么所有工作都必须完成,基本上是作为原子操作。 这样做的问题在于,有时候,由于应用程序使用堆空间的方式发生了变化,收集collection set集合集)的垃圾最终会变得太大而且收集时间太长而导致暂停时间目标无法满足。

在JDK 12中,如果G1识别出这种情况,它将在collection set集合集)开始工作中途中止收集,这样就不会影响应用程序继续为新对象分配空间。这样的话G1将更好地实现暂停时间的目标。

G1 垃圾收集器的增强

在 JVM中,堆一般会占据很大的内存,当它启动时,它将从底层操作系统虚拟内存分配器请求内存。 在应用程序运行时,GC会进行如下检查,发现堆所需的内存量并不多,这样的情况就可以把部分已经分配的内存返回给操作系统以供其他应用程序使用。

在JDK 12中,G1将在应用程序不活跃的期间定期尝试继续或触发并发周期以确定整体Java堆使用情况。未使用的内存可以更及时和可预测的方式返回到操作系统。

新的命令行标志-XX:G1PeriodicGCInterval可用于设置检查之间的毫秒数。

对于长时间处于空闲状态的应用程序,该功能将使JVM的内存利用率更加充分。

总结

JDK 12提供了不少的新功能和API,switch表达式对开发人员来说是最实用,同时使用 G1的用户也享受到了改进带来的好处,我建议大家可以持续关注我,如果一旦有了新的功能发布,我定会快速跟进更新。

资料分享

这是我从某优质机构弄来的一些资料,内容我认为确实称得上优质二字,如需领取,请点赞这篇文章,关注我然后点击这里即可免费领取

首先分享一份学习大纲,内容较多,涵盖了互联网行业所有的流行以及核心技术,以截图形式分享:

(亿级流量性能调优实战+一线大厂分布式实战+架构师筑基必备技能+设计思想开源框架解读+性能直线提升架构技术+高效存储让项目性能起飞+分布式扩展到微服务架构…实在是太多了)

其次分享一些技术知识,以截图形式分享一部分:

Tomcat架构解析:

算法训练+高分宝典:

Spring Cloud+Docker微服务实战:

最后分享一波面试资料:

切莫死记硬背,小心面试官直接让你出门右拐

1000道互联网Java面试题:

Java高级架构面试知识整理:

切莫死记硬背,小心面试官直接让你出门右拐

1000道互联网Java面试题:

[外链图片转存中…(img-HQXzZ2pv-1623728384458)]

Java高级架构面试知识整理:

[外链图片转存中…(img-ZV0O3A0U-1623728384459)]

  • 15
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 15
    评论
### 回答1: 要拉取 openjdk:11-jdk-stretch docker 镜像,可以按照以下步骤进行: 首先,确保已经安装了 Docker 并且可以正常运行。你可以在终端中输入 docker version 来检查 Docker 版本信息。 接下来,在终端中运行以下命令来拉取 openjdk:11-jdk-stretch 镜像: docker pull openjdk:11-jdk-stretch 这个命令会从 Docker Hub 上下载 openjdk:11-jdk-stretch 镜像,并且自动保存到本地。 拉取过程可能会需要一些时间,具体取决于你的网络速度。 当下载完成后,你可以使用以下命令来查看已下载的镜像列表: docker images 这个命令会列出所有本地已下载的镜像,你可以在其中找到刚刚拉取的 openjdk:11-jdk-stretch 镜像。 接下来,你可以使用以下命令来创建并运行一个基于 openjdk:11-jdk-stretch 镜像的容器: docker run -it openjdk:11-jdk-stretch 这个命令会自动运行 openjdk:11-jdk-stretch 镜像,并通过交互模式(-it 参数)连接到容器的终端。 现在你可以在容器中运行 Java 应用程序或执行其他操作。在容器中进行的更改和操作将不会影响到本地机器。 最后,如果你想停止正在运行的容器,可以按下 Ctrl+C 来退出容器终端,并使用以下命令停止容器: docker stop 容器ID 这里的 "容器ID" 是你要停止的容器的唯一标识符。 以上就是使用 Docker 拉取 openjdk:11-jdk-stretch 镜像的步骤和基本操作。希望对你有所帮助! ### 回答2: 要拉取 OpenJDK 11 的 Docker 镜像,可以使用以下命令: ``` $ docker pull adoptopenjdk/openjdk11:jdk-11.0.12_7-docker-stretch ``` 这个镜像使用了 AdoptOpenJDK 组织提供的 OpenJDK 11 版本,并基于 Debian Stretch 系统构建。 首先,我们使用 `docker pull` 命令指定要拉取的镜像。它会下载镜像的最新版本并保存到本地。在这个命令中,我们使用了 `adoptopenjdk/openjdk11` 作为镜像的仓库名,后面的 `jdk-11.0.12_7-docker-stretch` 是具体的版本标识符,表示要拉取的是 OpenJDK 11 版本。 拉取镜像可能需要一些时间,取决于你的网络速度和镜像的大小。一旦拉取完成,你就可以使用该镜像来创建和运行基于 OpenJDK 11 的应用程序的容器了。 希望这个回答对你有所帮助! ### 回答3: 要拉取OpenJDK 11的JDK镜像,可以使用以下命令: ``` docker pull openjdk:11-jdk-stretch ``` 这个命令会从Docker Hub上拉取OpenJDK 11的JDK镜像,镜像的标签为"stretch",表示基于Debian 9系统。 拉取过程中,Docker会自动下载并解压镜像文件。完成后,你就可以在本地使用该镜像来构建和运行Java应用程序。 OpenJDK是一个开源的Java开发工具包,它提供了Java编译器、运行时环境和相关的开发工具。通过使用Docker拉取OpenJDK镜像,你可以快速搭建开发和测试环境,而无需手动安装和配置Java环境。 在拉取完镜像之后,你可以使用以下命令来查看已拉取的镜像列表: ``` docker images ``` 该命令会显示已拉取的OpenJDK 11镜像的详细信息,包括镜像ID、标签、大小和创建时间等。 希望这个回答能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值