Java11新特性概览

一、JShell(java9已经开始支持)

1、类似于python中的求值-打印循环(Read-Evaluaction-Print Loop),目的在与即时结果和反馈

2、java9引入了shell这个交互性工具,让java也可以像脚本语言一样来运行,可以从控制台启动jshell,在jshell中直接输入表达式并查看其执行结果,当需要测试一个方法的运行效果或是快速的对表达式进行求值时,jshell都非常实用

3、除了表达式外,还可以创建java类和方法。jshell也有 基本的代码完成,不在需要解释必须有public static void main(String[] args)这句话

4、使用方式:

  • 直接写代码片段即可调用
  • 打开java文件使用

5、常见命令:

/help查看帮助

二、Dynamic Class-File constants类文件新添的一种结构

1、java的类型文件格式将被拓展,支持一种新的常量池格式:CONSTANT Dynamic加载CONSTANT Dynamic会将创建委托给bootstrap方法

目标:其目标是降低开发新形式的可实现类文件约束带来的成本和干扰

三、局部变量类型推断(var关键字)

1、什么是局部变量类型推断

局部变量类型推断指的是java不在需要给变量定义具体的数据类型而是使用var来定义,编译器能根据右边表达式自动推断类型,例如

var str = "java";就相当于 String str = "java"

注意:使用var语法必须进行初始化,因为var需要根据右侧进行类型判断

2、作用在lambda表达式上可以使用注解 (@NoneNull var a)->{ XXX }

四、java11新的API

1、集合的创建以更简单的方式初始化

List list = new ArrayLiist<>();

list.add("a");

list.add("b");

可直接改写为:

List list = List.of("a","b");

注意这里返回的list不是java.util下的list 不可继续add元素

Set集合类似

2、Stream的改变

Stream.ofNullable(null);//创建流的时候可传入null 防止出现空指针异常

Stream.takeWhile(Predicate);//从流中获取判定为真的元素,判定为假的时候 就停止判定

Stream.dropWhile(Predicate);//从流中获取为假的元素,判定为真丢弃,直到判定为假,停止判定

Stream.iterate(1,t->tt*3+1);//无限流通过中间的判断创建有限流

3、String函数新增和改变

isBlank()判断字符串是否为空白 包括空格回车 空字符串

strip()去除字符串首尾空白 对比trim(),trim()只能去除unicode码值小于32的字符 如汉字空格,所以strip()是对trim()的增强

stripTrailing()去除尾部空白

stripLeading()去除首部空白

repeat(count);复制字符串count次

lines().count();行数统计 lines返回一个Stream

4、inputStream加强方法transferTo(os)直接把输入流交给输出流就可完成复制文件

五、标准java异步Http客户端

java的http工具不在依赖第三方,java本身封装的api

六、java执行源文件可不再编译

注意:执行源文件中的第一个类(第一个类必须包括主方法),并且不可以使用其他源文件中的自定义类(不可跨文件操作)

七、垃圾收集器

1、新的Epsilon垃圾收集器

A NoOp Garbage Collector

JDK上对这个特性的描述是:开发一个处理内存分配但是不实现任何实际内存回收机制的GC,一旦可用堆内粗用户,JVM就会退出

如果有System.gc()调用,实际上什么也不会发生(这种场景下和-XX:DisableExplicitGc效果一样),因为没有内存回收,这个实现可能会警告用户强制GC是徒劳的

用法:-XX:+UnlockExperimentalVMOptions -XX:+UseEpsilonGC

使用原因:

提供完全被动的GC实现,具有有限的分配限制和尽可能低的延迟开销,但代价是内存占用和内存吞吐量

java实现可广泛选择高度可配置的GC是,各种可用的收集器最终满足不同的需求,即是它们的可配置性使他们的功能相交,有时更容易维护单独的实现,而不是在现有GC实现上堆积另一个配置选项

主要用途:

性能测试(它可以帮助过滤掉GC引起的性能假象)

内存压力测试(例如,知道测试用例 应该分配不超过1GB的内存,我们可以使用-Xxx1g -XX:+UseEpsilonGc,如果程序有问题那么就会崩溃)

非常短的job任务(对象这种任务,接受GC清理堆都是浪费空间)

VM接口测试:

Last-drop 延迟&吞吐改进

2、ZGC垃圾收集器

ZGC,A Scalable Low-Latency Garbage Collector(Experimental)

ZGC是jdk11最为瞩目的特性,但是后面带了Experimental,说明不建议用到生产环境

优点:

GC暂停时间不超过10ms

即能处理几百兆的小堆也能处理几个T的大堆

和G1相比应用吞吐能力不会下降超过15%

为未来GC功能和利用colord指针以及Load barriers优化奠定基础 初始只支持64位系统

ZGC的设计目标是:支持TB级别内存容量,暂停时间低,对整个程序吞吐量影响小于15%,将来还可以扩展实现机制,以支持不少令人兴奋的功能,例如多层堆(即热对象置于DRAM和冷对象置于NVMe闪存)或压缩堆

GC是java的主要优势之一,然而当GC停顿太长,就会开始影响应用的响应时间,消除或减少GC停顿时常,Java将堆更广泛的应用场景是一个更有吸引力的平台,此外,现代系统中可用内存不断增长,用户和程序员之间希望JVM能够以搞笑的方式充分利用这些内存,并且无须长时间的GC暂停时间

ZGC是一个并发,基于region压缩型的垃圾收集器,只有root扫描阶段会STW(stop the world),因此GC停顿时间不会随着堆的增长和存货对象的增长而变长

ZGC : avg 1.091ms max 1.681ms

G1 : avg 156.806ms max 543.846ms

用法: --XX:+UnlockExperimentalVMotions -XX:+UseZGC ,因为ZGC还处于实验阶段,所以需要通过jvm参数来解锁这个特性

八、FightRecorder java黑匣子

Fight Recorder 以前是商业版的特性,在java11中开源出来,它可以导出事件到文件中,之后可以用Java Mission Conrol来分析,可以在应用启动时配置 java -XX:StartFightRecording或者在应用程序启动后使用jcmd来录制比如

$ jcmd JFR.start

$ jcmd JFR.dump filename=recording.jfr

$ jcmd JFR.stop

是oracle刚开源的强大特性,jfr性能最大开销不超过1%

总结:虽然java11更新已经有些时间了,但是目前国内在用的公司并不多。java11后续也将是Oracle公司持续支持的一个版本,强大的G1垃圾收集器目前也处于适应性阶段,相信当java11广泛出线在中国市场的时候,Java行业会产生一些颠覆性的事件,笔者也并未深入研究,本文只是笔者通过学习做的一个简单的概要,后续深入了解后会继续补充本文。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值