https://www.developers.pub/article/1194465

https://kaimingwan.com/2024/01/29/vvtzk3gai7530pmp/

https://kaimingwan.com/2023/01/31/bybtiusebwcawiyd/

https://www.cnblogs.com/javastack/p/14583578.html

https://www.javanorth.cn/2022/12/31/G1GC%E8%B0%83%E4%BC%98%E5%8F%82%E6%95%B0-2023-01-16%E5%B7%B2%E5%8F%91/

https://openjdk.org/projects/

Amber

字符串模板、简化 main 方法、 statements before this () and super ()

Records、Sealed Class、Pattern Matching、Raw String Literals

  • 简化 main 方法
void main() {
    System.out.println("Hello, World!");
}
javac --enable-preview  --release 23 Hello.java
java --enable-preview   Hello
java --enable-preview   Hello.java

JEP-286/323

  • 局部变量类型推断:Java 10 var 关键字,编译器自动推断类型信息

  • switch 表达式:Java 12

    四项改进:fall-through语义,组合形式,穷举性,表达式形式

    类似模式匹配,保证只有一种路径会被执行,并且不需要break语句

    String fruit = "apple";
    switch (fruit) {
    case "apple" -> System.out.println("Selected apple");
    case "pear" -> System.out.println("Selected pear");
    case "mango" -> {
        System.out.println("Selected mango");
        System.out.println("Good choice!");
    }
    default -> System.out.println("No fruit selected");
    }

    变量赋值

    int opt;
    switch (fruit) {
    case "apple":
        opt = 1;
        break;
    case "pear":
    case "mango":
        opt = 2;
        break;
    default:
        opt = 0;
        break;
    }

    新switch,不需要break,还可直接返回

    String fruit = "apple";
    int opt = switch (fruit) {
        case "apple" -> 1;
        case "pear", "mango" -> 2;
        default -> 0;
    }; // 注意赋值语句要以;结束
    System.out.println("opt = " + opt);

    复合case

    switch (event) {
        case PLAY ->
            System.out.println("User has triggered the play button");
        case STOP, PAUSE ->
            System.out.println("User needs to relax");
    };

    yield返回一个值作为switch语句返回值

    String fruit = "orange";
    int opt = switch (fruit) {
        case "apple" -> 1;
        case "pear", "mango" -> 2;
        default -> {
            int code = fruit.hashCode();
            yield code; // switch语句返回值
        }
    };
    System.out.println("opt = " + opt);

with 表达式和 primitive types in patterns

从Java 8开始,Java的发展很明显受到了函数式编程的影响

  • Java 8引入lambda表达式及流(stream)
  • Java 9带来支持响应式流的Flow API
  • Java 10新增了局部变量类型推导

Babylon

Leyden

为了解决java启动慢的问题

java是解释+JIT一起工作的,leyden项目的目的就是替换老的这种方式,称之为static-image,相比传统AOT只是直接把代码编译成机器码,static-image除了把代码编译成机器码,还会把runtime信息一起编译成机器码,在运行时能够完整运行

Loom

旨在拓展jdk 1:1的线程模型,引入协程

以前jdk线程模型和操作系统线程1:1对应,适合CPU密集型任务,但对于需要大量线程的I/O密集型任务,过重的线程开销和频繁的上下文切换对性能开销都比较大

那种侵入很强,不仅要引入新的返回类型,future或者promise,而且还要引入两个额外的关键字async和await,特别麻烦

Panama

Upcall: 本地代码调Java

Downcall:Java调本地代码

Panama在downcall上的意义在于,可以省略JNI那样的wrapper,直接加载动态链接库以及根据symbol取函数地址。少一个wrapper可以少一次函数调用

Panama也给给内存结构做了标准化。JVM也可以算是支持 结构体、union、值类型 了

  • Vector API
  • Foreign Function
  • Memory API
  • jextract

Valhalla

Java一切皆对象理念对于工程化很有帮助,但处理一系列类型不同的小对象时性能十分拉胯 Valhalla项目通过引入值对象来改善这一问题,提升java在游戏、图形领域竞争力

Lilliput

缩小 HotSpot JVM 中 Java object headers 的大小并减少 Java 内存占用

fast-locking scheme