Java21 make Java great again

2023-06-16 08:21:18 +08:00
 javak

今天用了下 oracle 放出来的 Java21 早期版本,( Java21 正式版要今年 9.19 发布)。

主要是为了测试虚拟线程( Java21 开始虚拟线程就是正式版了),这是是一个类是 go 协程的东西。

我搞了 100 万个任务,每个任务一个线程模式,效果非常惊艳炸裂。cpu 、内存消耗非常稳定,也不高。相同情况用 Java 之前的普通线程( Java21 开始叫平台线程)试了下,吞吐完全不行,而且 CPU 、内存占用很高、起伏也很大。

上面只是随手简单一测,并不严格和规范。但是效果我觉得还是能说明问题,那就是很强、很惊艳。我认为现在已经算是可以追平之前 go 吹爆的 go 协程特性了。

所以就有了标题的感慨。

10988 次点击
所在节点    Java
98 条回复
HaroldFinchNYC
2023-06-16 13:53:36 +08:00
@Morii 王者农药?
javak
2023-06-16 14:09:20 +08:00
@diagnostics #58

第一版预览,jep425
https://openjdk.org/jeps/425

第二版预览,jep436
https://openjdk.org/jeps/436

正式版,jep444
https://openjdk.org/jeps/444

每一版都有些变化和改进。
zhouquanbest
2023-06-16 14:18:41 +08:00
还是 Kotlin 吧 别挣扎了
yangyaofei
2023-06-16 14:23:12 +08:00
更关心 String Template, 可以愉快的用类似 python 的 f-string 方式写 String 了. 至于性能什么的, 小作坊的自行车没机会上高速
28Sv0ngQfIE7Yloe
2023-06-16 14:34:36 +08:00
@HaroldFinchNYC

不是哈哈
oldshensheep
2023-06-16 14:51:08 +08:00
yangyaofei
2023-06-16 15:24:58 +08:00
@oldshensheep 用过不是很好用, 最后用了 com.antkorwin:better-strings:0.5 , 但是也就那样, IDE 的支持也一般吧, 而且还需要构建环境上加上一堆设置.
RainCats
2023-06-16 16:03:18 +08:00
@dreamramon 大佬看看有没空拉一帮同道去把那些库用 Java 整一下[坏笑]
SeaTac
2023-06-16 16:09:13 +08:00
@impossibleshen
没有 公司内部的 channel
dreamlike
2023-06-16 16:12:06 +08:00
virtual thread 目前 public 的 api 都太简单了,不如 kt 可以微操调度,所以我还搞了这个玩意 https://github.com/dreamlike-ocean/UnsafeVirtualThread ,来搞手操调度,指定调度器,捞 carrierThread
virtual thread 好处对我来说有两处:
1,是沟通 Reactive 到 Blocking 的桥梁,我可以低成本来复用老的 BIO 生态,比如我就喜欢开虚拟线程跑 jdbc+myabtis/hibernate,比 hibernate reactive 好用多了
2,我可以低成本将异步转同步,比如说 Future.await ,直接捞 continuation api 起来自己做调度也很好玩,对于 reactive 生态来说就无需引入 kotlin ,也无需被无栈协程的染色效应困扰
Ericcccccccc
2023-06-16 18:57:03 +08:00
最近 java 最大的一个优化应该是推广 zgc, 10ms 以内.
jklove123bai
2023-06-16 19:03:31 +08:00
@Morii 梦幻西游?
dbpe
2023-06-16 19:06:05 +08:00
@Ericcccccccc zgc 话说这玩意代价不是减低吞吐么?还是说我 Out 了..最近这个代价也解决了?
javak
2023-06-16 19:14:34 +08:00
@dbpe 吞吐降低不多,还有监控时都懂三倍内存问题,不好解决
dqzcwxb
2023-06-16 19:16:33 +08:00
@javak #74 jdk21 要上 zgc 分代并取消多重映射,三倍内存的问题就没了
javak
2023-06-16 19:22:27 +08:00
@dqzcwxb 太棒了,我要去研究下分代 zgc 了
lixintcwdsg
2023-06-16 21:42:06 +08:00
现在 99%的线程池的确可以用虚拟线程代替,尤其是是 web 应用,大量下游各种调用的。
一些老框架会焕发青春,比如一些用 netty 改造的 client ,有了虚拟线程就没这个必要了就直接用线程池+同步代码就可以。
还有就是大部分 reactive 场景其实都是不需要的,改回同步代码即可
beijinglowb
2023-06-16 21:46:51 +08:00
可惜屎山迭代的难度不亚于重写了
humpy
2023-06-16 22:25:22 +08:00
相比这个,我更喜欢的还是终于要有语言层面的 nullability 了,kotlin 我唯一喜欢的 feature 。以后就不用写 @Nullable 注解了

https://mail.openjdk.org/pipermail/valhalla-spec-experts/2023-May/002276.html
Ericcccccccc
2023-06-17 02:23:24 +08:00
@dbpe 官方的宣传是大多数时候 stw 时间能控制在 1ms 以内, 并且和堆大小无关.

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/949151

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX