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 协程特性了。

所以就有了标题的感慨。

10986 次点击
所在节点    Java
98 条回复
yusheng88
2023-06-16 11:19:18 +08:00
虚拟线程主要解决 io 密集型任务导致的线程数多(内存占用多),上下文切换成本高问题。目前的上述问题的解决方案是 netty ,reactive 相关框架,但写法不直观。重点还是要发送请求的工具类也要支持非阻塞的。单纯使用虚拟线程,但 Java 的请求相关类没做改造的话,意义不大。
yusheng88
2023-06-16 11:22:15 +08:00
jdk21 出来的话,应该会推动很多类库更新
nikenidage1
2023-06-16 11:27:57 +08:00
其实没用的,你看 C#,主流语言里第一个实现 async/await 协程的,也没见到增加多少使用者。
使用某一个语言,往往不是因为这个语言是否有哪些特性、是否优秀。更多的因素是政治和历史原因
Uplay
2023-06-16 11:40:13 +08:00
@nikenidage1 中肯,感觉都是惯性
ychost
2023-06-16 11:43:33 +08:00
已经用了 kotlin 的无栈协程,性能提升非常好
voidmnwzp
2023-06-16 11:47:32 +08:00
go 的所有并发原语(mutex,channel)都是基于协程实现的,如果 jdk 单纯加了个虚拟线程,synchronized ,reenterLock 底层实现不变那也没啥意义,而且也不知道 jdk 的协程调度是否就比 go 的 gmp 高明
voidmnwzp
2023-06-16 11:49:46 +08:00
jdk 的 io 库 还是 bio 那套,要用 nio 就得上 netty ,但 netty 这种异步基于事件的处理模式远不如 go 通过协程包装的伪 bio 模式直观简单
Masoud2023
2023-06-16 11:59:10 +08:00
你说的对,但是《 Java8 》是由 Oracle 自主研发的一款虚拟机。游戏发生在一个被称作「多线程」的幻想世界,在这里,被 jdk 选中的 Callable 将被授予「 CompletableFuture 」,导引线程之力。你将扮演一位名为「小公司程序员」的神秘角色只能在苦逼的编码中邂逅性格各异、能力独特的业务代码,和他们一起创造新屎坑,找回失散的劳动法——同时,逐步发掘「异步」的真相。
mmdsun
2023-06-16 12:01:51 +08:00
@yazinnnn
现在 Java 高并发应该流行 Reactive Programming ? ThreadLocal 不是什么好设计了吧?与反应式也完全不兼容。
spring 新框架 webflux 也是支持,用的是 Context 传递之和当前操作,只与 Flux 和 Mono 相关。

JDK9 也是新加了 Reactive Streams API 的支持,假设不用 spring webflux 单独用 Rxjava 和 Project Reactor 用链式操作符传递也够了。完全可以不用 ThreadLocal
yazinnnn
2023-06-16 12:06:58 +08:00
@voidmnwzp
loom 对 bio 有提升

如果你写 netty 之类的 nio 代码很快乐,可以不用理会 loom, 不快乐的话可以切换到 kotlin 协程, 或者切换到 loom+bio
oldshensheep
2023-06-16 12:11:04 +08:00
还有个更好的消息,GraalVM 的免费版本增加了一个 Oracle GraalVM ,这个是完全免费使用,允许商业使用的。而且可以使用 EE 版本的很多功能,比如 PGO ,G1GC ,压缩指针。这些功能在开源的版本当中是没有的。

https://medium.com/graalvm/a-new-graalvm-release-and-new-free-license-4aab483692f5
SeaTac
2023-06-16 12:33:48 +08:00
我们内部有一个好几千人的活跃 slack channel ,讨论如何解决 service 在从 jdk8 migrate 到 17 当中出现的问题
aaronnew89
2023-06-16 12:34:08 +08:00
@oldshensheep 能把多语言支持完全开源允许商用就好了
fox0001
2023-06-16 13:28:25 +08:00
第一次看到虚拟线程的介绍就震惊了。虽然很期待,但是,用起来才是正道。
lesismal
2023-06-16 13:30:24 +08:00
越是挣扎,越是真的要没落了。
kenvix
2023-06-16 13:42:21 +08:00
@hhjswf 你在说什么,计算任务直接 new Thread 朴素平台线程就行了, 甚至线程池都不需要
kenvix
2023-06-16 13:44:32 +08:00
@voidmnwzp 我觉得这就是差异化竞争,要这种你可以选用同样的 Java 体系的 Kotlin Coroutines
diagnostics
2023-06-16 13:48:54 +08:00
@wangxiaodong #26
@TWorldIsNButThis #29

对对对,你俩是真懂。gRPC benchmark 里 scala-akka 去年还是前几,OP 说的变革,Fibers 能做的,actor 也能做个 80%,更不用说 VT 现在连线程公平性都没搞出来( JEP-425 的时候)背后一大堆隐藏的性能 BUG 。

要讨论可以,先 follow up 行业知识再来,JEP-425 都没看完都指点江山了?
impossibleshen
2023-06-16 13:49:51 +08:00
@seaiaddca 怎么加入呢?有没有啥电报群啊什么的
diagnostics
2023-06-16 13:51:35 +08:00
@yusheng88 #41 哥们你是懂得,帖内太多半桶水半吊子的指点江山了

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

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

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

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

© 2021 V2EX