jdk11

jshell

除了表达式外,可以创建java类和方法

局部类型推断

var: 参考jdk10

集合新api

List.of(); List.copyOf(); 参考jdk9,jdk10

Stream 加强

ofNullable(); 参考jdk9

String

    @Test
    public void t1(){
        String s = "\t \r\n";
        System.out.println(s.isBlank());//是否空白

        s="\t \r\n abc \t";
        System.out.println("---------------------");
        String s1 = s.strip();//去除首尾空白, trim()只能去除英文空格,strip()能去除任何空白字符
        System.out.println(s1);
        System.out.println(s1.length());//0
        System.out.println("---------------------");
        s.stripTrailing();//去除尾部
        s.stripLeading();//去除首部

        System.out.println("---------------------");
        "java".repeat(3);//复制
        System.out.println("---------------------");
        "A\nB\nC".lines().count(); // 行数统计
    }

InputStream

    //inputStream
    @Test
    public void t2() throws IOException {
        var classLoader = this.getClass().getClassLoader();
        var inputStream = classLoader.getResourceAsStream("jdk_version/java11/javastack");
        try (var outputStream = new FileOutputStream("src/jdk_version/java11/javastack2")) {
            inputStream.transferTo(outputStream);
        }
        inputStream.close();
    }

java异步http客户端

public class HttpClientTest {
    @Test
    public void t1() throws IOException, InterruptedException {
        var request = HttpRequest.newBuilder()
                .uri(URI.create("https://javastack.cn"))
                .GET()
                .build();
        var client = HttpClient.newHttpClient();
        // 同步
        HttpResponse<String> response = client.send(request, HttpResponse.BodyHandlers.ofString());
        System.out.println(response.body());
        // 异步
        client.sendAsync(request, HttpResponse.BodyHandlers.ofString())
                .thenApply(HttpResponse::body)
                .thenAccept(System.out::println);
    }
}

更简化的编译运行程序

java Javastack.java 直接可编译运行

  • 执行源文件中的第一个类, 第一个类必须包含主方法
  • 并且不可以使用别源文件中的自定义类, 本文件中的自定义类是可以使用的

unicode10

Unicode 10 增加了8518个字符, 总计达到了136690个字符. 并且增加了4个脚本.同时还有56个新的emoji表情符号

新的Epsilon垃圾收集器

A NoOp Garbage Collector JDK上对这个特性的描述是: 开发一个处理内存分配但不实现任何实际内存回收机制的GC, 一旦可用堆内存用完, JVM就会退出.
如果有System.gc()调用, 实际上什么也不会发生(这种场景下和-XX:+DisableExplicitGC效果一样), 因为没有内存回收, 这个实现可能会警告用户尝试强制GC是徒劳

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

public class EpsilonTest {
    public static void main(String[] args) {
        boolean flag = true;
        List<Garbage> list = new ArrayList<>();
        long count = 0;
        while (flag) {
            list.add(new Garbage());
            if (list.size() == 1000000 && count == 0) {
                list.clear();
                count++;
            }
        }
        System.out.println("程序结束");
    }
}

class Garbage {
    int n = (int) (Math.random() * 100);

    //gc在清除本对象时会调用一次
    @Override
    public void finalize() {
        System.out.println(this + " : " + n + " is dying");
    }
}
//如果使用选项-XX:+UseEpsilonGC, 程序很快就因为堆空间不足而退出
  • 使用这个选项的原因 :

    提供完全被动的GC实现, 具有有限的分配限制和尽可能低的延迟开销,但代价是内存占用和内存吞吐量.
    众所周知, java实现可广泛选择高度可配置的GC实现. 各种可用的收集器最终满足不同的需求, 即使它们的可配置性使它们的功能相交. 有时更容易维护单独的实现, 而不是在现有GC实现上堆积另一个配置选项

  • 主要用途

    性能测试(它可以帮助过滤掉GC引起的性能假象) 内存压力测试(例如,知道测试用例 应该分配不超过1GB的内存, 我们可以使用-Xmx1g –XX:+UseEpsilonGC, 如果程序有问题, 则程序会崩溃) 非常短的JOB任务(对象这种任务, 接受GC清理堆那都是浪费空间) VM接口测试 Last-drop 延迟&吞吐改进

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

  • GC暂停时间不会超过10ms
  • 既能处理几百兆的小堆, 也能处理几个T的大堆(OMG)
  • 和G1相比, 应用吞吐能力不会下降超过15%
  • 为未来的GC功能和利用colord指针以及Load barriers优化奠定基础
  • 初始只支持64位系统

ZGC的设计目标

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

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

public class ZGCTest {
    public static void main(String[] args) {
        List<Garbage2> list = new ArrayList<>();
        int count = 0;
        boolean flag = true;
        while (flag){
            list.add(new Garbage2());
            if(count++==200){
                list.clear();
            }
        }
    }

}
class Garbage2{
    double d1 = 1;
    double d2 = 2;

    @Override
    protected void finalize() throws Throwable {
        System.out.println(this + " is collection");
    }
}

完全支持Docker容器

支持G1上的并行完全垃圾收集

对于 G1 GC,相比于 JDK 8,升级到 JDK 11 即可免费享受到:并行的 Full GC,快速的 CardTable 扫描,自适应的堆占用比例调整(IHOP),在并发标记阶段的类型卸载等等。这些都是针对 G1 的不断增强,其中串行 Full GC 等甚至是曾经被广泛诟病的短板,你会发现 GC 配置和调优在 JDK11 中越来越方便

Low-Overhead Heap Profiling免费的低耗能飞行记录仪和堆分析仪

通过JVMTI的SampledObjectAlloc回调提供了一个开销低的heap分析方式
提供一个低开销的, 为了排错java应用问题, 以及JVM问题的数据收集框架, 希望达到的目标如下 :

  • 提供用于生产和消费数据作为事件的API
  • 提供缓存机制和二进制数据格式
  • 允许事件配置和事件过滤
  • 提供OS,JVM和JDK库的事件

实现RFC7539中指定的ChaCha20和Poly1305两种加密算法, 代替RC4

Java Flight Recorder

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

Copyright © zhaojq 2019 all right reserved,powered by Gitbook本书发布时间: 2021-01-19 20:53:29

results matching ""

    No results matching ""