其他分享
首页 > 其他分享> > 小滴课堂21年工业级PaaS云平台+SpringCloudAlibaba+JDK11综合项目实战

小滴课堂21年工业级PaaS云平台+SpringCloudAlibaba+JDK11综合项目实战

作者:互联网

1 JDK11新特性介绍#
1.1 初识JDK11新特性#
北京时间2018年9月26日,Oracle官方宣布JDK11(18.9LTS)正式发布。这是Java8以后支持的首个长期版本,非常值得关注。最近发布的JDK11将带来ZGC、HttpClient等重要特性,一共包含了17个JEP(Java Enhancement Proposals,Java增强提案)。
本次发布的JDK11和2017年9月份发布的JDK9以及2018年发布的JDK11相比,最大的区别就是:在长期支持方面,Oracle表示会对JDK11提供大力支持。
1.2 JDK11新特性更新列表#
我们可以在如下网站中查看JDK11的新特性增强提案详情:
http://openjdk.java.net/projects/jdk/11/
JDK11新特性特性列表

2 JDK11新特性详解#
2.1 基于嵌套的访问控制#
如果在一个类中嵌套了多个类,各个类可以直接访问彼此的私有成员。JDK11在private、public、protected的基础上,JVM又提供了新的访问机制:Nest。

JDK11之前的如下案例:

package com.sunxiaping;

/**

public class Inner$Outer {
public void method() {
System.out.println("str = " + Outer.access$000(Outer.this));
}
}
以上方案虽然从逻辑上讲,内部类和外部类相同代码实体的一部分,但它被编译为一个单独的类,因此,它需要编译器创建合成桥接方法,以提供对外部类的私有字段的访问。
这种方案一个很大的坑是反射的时候有问题,当使用反射在内部类中访问外部类私有成员str时会报IllegalAccessException异常,这个是让人难以理解的,因为反射还是源码级访问的权限。
package com.sunxiaping;

import java.lang.reflect.Field;

/**

/**

示例:

package com.sunxiaping;

import java.util.List;

/**

/**

/**

/**

/**

/**

import java.util.Arrays;
import java.util.List;

/**

import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;

/**

HttpClient目的是取代JDK8中的httpURLConnection。

2.6.2 优势#
API是易于使用的,包括简单的阻塞模式。
支持通知机制如HTTP消息头收到、错误码、HTTP消息体收到。
简洁的API能够支持80~90%的需求。
支持标准和通用身份验证机制。
能够轻松使用WebSocket。
支持HTTP2。
执行和现有网络API一致的安全检查。
对Lambda表达式等新语言功能友好。
对嵌入式系统友好,避免永久运行的后台线程。
支持HTTPs/TLS。
满足HTTP1.1和HTTP2的性能要求。
2.6.3 应用示例#
示例:
package com.sunxiaping;

import org.junit.Test;

import java.io.IOException;
import java.net.URI;
import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.util.concurrent.CompletableFuture;

/**

示例:

package com.sunxiaping;

import java.util.concurrent.TimeUnit;

/**

示例:

package com.sunxiaping;

/**

2.9 Epsilon垃圾收集器#
2.9.1 概述#
Epsilon垃圾收集器,又称为无操作垃圾收集器。
JDK对这个特性的描述是:开发一个处理内存分配但是不实现任何实际内存回收机制的GC,一旦Java的堆内存被耗尽,JVM就直接关闭。
如果有system.gc();调用,实际上什么也不会发生垃圾对象的回收操作,因为没有内存回收,这个实现可能会警告用户尝试强制GC是徒劳的。
2.9.2 应用示例#
示例:使用G1垃圾收集器
package com.sunxiaping;

/**

import java.util.ArrayList;
import java.util.List;

/**

会发现G1一直回收对象,直到内存不够用。

使用Epsilon垃圾收集器,需要设置启动参数:
-XX:+UnlockExperimentalVMOptions
-XX:+UseEpsilonGC
-Xms100m
-Xmx100m
使用Epsilon垃圾收集器后

会发现很快就内存溢出了,因为Epsilon不会去回收对象。

2.9.3 应用场景#
性能测试:Epsilon垃圾收集器可以帮助我们过滤掉GC引起的性能假象。
内存压力测试:在测试Java代码的时候,确定分配内存的阈值有助于设置内存压力常量值。
非常短的JOB任务:对象这种任务,接受GC清理堆就是浪费空间。
VM接口测试:以VM开发视角,有一个简单的GC实现,有助于理解VM-GC的最小接口实现,它也用于证明VM-GC接口的健壮性。
……
2.10 ZGC可伸缩低延迟垃圾收集器#
2.10.1 ZGC的目标#
GC是Java主要优势之一。然而,当GC停顿太长,就会开始影响应用的响应时间。消除或者减少GC停顿时长,Java将对更广泛的应用场景是一个更有吸引力的平台。此外,现代系统中可用内存不断增长,用户和程序员希望JVM能够以高效的方式充分的利用这些内存,并且无需长时间的GC暂停时间。
今天,应用程序同时为数千甚至数百万用户提供服务的情况并不多见。这些应用程序需要大量内存,但是,管理所欲内存可能会轻易影响应用程序性能。为了解决这个问题,Java11引入了ZGC垃圾收集器作为实验性垃圾收集器的实现。
ZGC全称Z Garbage Collector,是一款可伸缩的低延迟、高并发的垃圾回收器,旨在实现以下目标:
1️⃣停顿时间不超过10ms。
2️⃣停顿时间不随heap大小或存活对象大小增大而增大。
3️⃣可以处理从几百G到几TB的内存大小,远远超过前一代的G1。
4️⃣初识只支持64位系统。
2.10.2 用法#
运行我们的应用程序时,我可以使用以下命令选项启动ZGC:
-XX:+UnlockExperimentalVMOptions -XX:+UseZGC
需要注意的是,ZGC处于实验阶段。
2.10.3 平台支持#
ZGC目前只在Linux/x64上可用,如果有足够的需求,将来可能会增加对其他平台的支持。

标签:PaaS,21,System,str,println,小滴,out,public,String
来源: https://blog.csdn.net/lsttwo/article/details/113834196