文章目录
Java11
可伸缩低延迟垃圾收集器-ZGC
(最核心)无论开了多大的堆内存(128G,2T),保证低于10ms的JVM停顿,远胜于前一代的G1
- 所有阶段几乎(除了开始的GCRoot的扫描)都是并发执行(应用线程与GC线程并发)
- 像G1一样划分Region,但更加灵活。每个region的大小不固定,动态创建销毁Region,动态决定大小,不同大小的对象分配在不同的Region里
- 和G1一样会做Compacting-压缩,
Unicode10
升级了现有平台API,支持Unicode10
支持emoji表情:例如 \uD83E
基于嵌套的访问控制
在private、public、protected基础上,提供了一种新的访问控制机制:Nest
如果在一个类中嵌套了多个子类,那么子类可以访问彼此的私有成员。
class Test{
private static class X{
private int x;
}
private static class Y{
void test(){
X x = new X();
x.x = 1; // 以上操作在java11之前也是允许的
Field field = X.getClass().getDeclaredField("x");
// 在java11之前需要将访问权限设置为true才可以进行私有字段的值设置,否则会报错
// field.setAccessible(true);
// java11中,不需要进行setAccessible(true)
field.setInt(x, 2);
}
}
}
动态类文件常量
增加了一个常量类型 CONSTANT_Dynamic
public class DynamicTest{
public void static main(String[] args) throws Throwable{
// MethodHandles为 java7中添加的常量类型
MethodHandles.Loopup lookup = MethodHandles.loopup();
// 使用 lookup寻找一个静态方法,参数为 类、静态方法名、返回值类型
// 它在运行的时候才会判断返回值类型
MethodHandle mh = lookup.findStatic(
DynamicTest.class, "test", MethodType.methodType(void.class)
);
// 此时 MethodHandle对象封装了test方法的全部信息
mh.invokeExact();// 运行结果会输出hello
}
private static void test(){
System.out.println("hello");
}
}
标准HTTP客户端
在JDK9中就已经引入了HTTPClient,到JDK11时,HTTPClient API作为一个标准API提供在java.net.http包中
目标:取代HttpURLConnection,此API在1.1发布,使用繁琐,并且只能以阻塞模式工作
public class HttpClientExample{
// 同步Get方法
private static void sysnGet(String uri) throws Exception {
HttpClient client = HttpClient.newHttpClient();
// 通过uri的方式创建一个request请求,参数为uri,调用build方法创建
HttpRequest request = HttpRequest.newBuilder().uri(
URI.create(uri)
).build();
// 声明一个HttpResponse对象接收 client发出的请求,send参数为request请求和响应的接收类型
HttpResponse<String> response = client.send(
request, HttpResponse.BodyHandlers.ofString()
);
System.out.println(response.statusCode());// 输出响应的状态码
System.out.println(response.body());// 响应内容
}
// 异步Get方法
private static void asynGet(String uri) throws Exception{
HttpClient client = HttpClient.newHttpClient();
// 通过uri的方式创建一个request请求,参数为uri,调用build方法创建
HttpRequest request = HttpRequest.newBuilder().uri(
URI.create(uri)
).build();
// 与同步Get不同的是,异步Get使用 CompleteableFuture来接收返回值
CompleteableFuture<HttpResponse<String>> future =
client.sendAsync(request, HttpResponse.BodyHandlers.ofString());
// 当future执行完成时
future.whenComplete(
(respon, ex) -> {
if (ex != null){ // 如果有异常,抛出
ex.printStackTrace();
} else {
System.out.println(respon.getStatusCode());
System.out.println(respon.body());
}
}
).join(); // 如果运行在main线程中,不阻塞获取不到结果
}
public static void main(String[] args) throws Exception{
String uri = "具体uri";
sysnGet(uri);
}
}
Lambda参数的本地变量语法
允许var作为声明隐式类型的lambda表达式的形参时使用
目标:将隐式类型的lambda表达式中的形参声明的语法 与 局部变量声明的语法对齐
java11之前:
- var作为关键字,但只能当作局部变量,不能当作类变量
- 使用时要赋初始值
- 并且var只是编译器做类型推断,赋初始值后,var的类型即已经确定,不能再更改
java11中:它最大的作用就是可以在lambda表达式参数上使用注解
public class Test{
private static void lambdaWithVar(){
List<Integer> nums = Arrays.asList(9,2,4,5);
nums.sort(
(@NutNULL var s1, @NutNULL var s2) -> { // 必须都是var变量
// 排序判断逻辑
}
);
}
}
启动单文件源代码程序
增强Java启动程序以运行作为单个Java源代码文件提供的程序
直接使用 java ***.java 运行源文件,不通过编译成的class文件运行
改进Aarch64内联函数
改进现有的字符串和数组h函数,并在Aarch64处理器上为java.lang.Math sin、cos和log函数实现新的内联函数
目标:专用的CPU架构可以提高应用程序的性能
Math.sin() cos() log()三个方法性能提高大概8-9倍
新增常用的API
String:
- strip:可以去掉Unicode空格(trim不可以)
- isBlank:字符串为空或仅包含空格返回false
- lines:返回Stream< String> ,字符串中行的流,由换行符去分割字符串
- repeat(int count):将字符串重复count次返回
- stripLeading:去掉字符串中的前导空格(就是正文前面的空格)
- stripTrailing:去掉字符串中的尾随空格
File:
- ReadString(Path path):将内容读为String
- WriteString(Path path)
public static void main(String[] args){
String path = "PATH";
// 参数为写入的文件路径、内容、编码
Files.writeString(Path.of(path), "content", StandardCharsets.UTF_8);
String content = Files.readString(Path.get(path), StandardCharsets.UTF_8);
}
List:
- 静态of()方法:
List<String> list = List.of("a", "b");
此方法生成的是不可变对象 - 通过集合创建数组:例如String数组:
String[] str = list.toArray(String::new);
删除了 Thread中的destory和stop方法
Java12(预览特性)
增强的switch语句
扩展switch语句,使其可以用作语句或表达式,并且"传统"或"简化"两种都可以使用
public static void main(String[] args){
int result = 1;
switch (result) {
case 0 -> System.out.println(1);
case 1 -> System.out.println(2);
default -> System.out.println(3);
}
// 支持返回值
result = swith(result){
case 0 -> 1;
case 1 -> 2;
default -> 3;
};
}
命令 javac --release 12 --enable-preview -Xlint:preview 文件名.java 编译 注意文件中不能有包名
java --enable-preview 文件名 执行
微基准测试
Microbenchmark 作为常规性能测试的一部分,在JDK源码中添加一些基础的微基准测试
目标:可以基于 Java Microbenchmark Harness (JMH) 轻松测试JDK的性能
默认的类数据共享
在64位平台上使用默认类列表,增强了JDK生成的类共享(CDS),改善了开箱即用的启动时间
在多个JVM间共享核心类,减少内存占用
对G1垃圾收集器的增强
如果G1垃圾收集器有可能超过预期的暂停时间,则可以使用中止选项
如果应用程序活动非常低,G1应该在合理的时间段内释放未使用的Java堆内存
目标: 可以中止可选部分的回收以达到停顿时间目标;可以在空闲时间自动将Java堆内存返还给操作系统