V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
hepin1989
V2EX  ›  程序员

大家 Java 21 的 虚拟线程用起来了吗?

  •  
  •   hepin1989 · 2024-02-01 21:48:18 +08:00 · 5829 次点击
    这是一个创建于 366 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我说一下我目前的数据:

    线程数下降 1200+ 内存下降:5pt CPU 下降:10pt

    感觉并没有 N 倍提升,是不是因为我的应用本身就是大部分都是 异步代码的 原因?

    53 条回复    2024-04-02 00:27:19 +08:00
    wbd31
        1
    wbd31  
       2024-02-01 22:15:17 +08:00
    pt 是什么单位?
    hepin1989
        2
    hepin1989  
    OP
       2024-02-01 22:17:59 +08:00
    @wbd31 你好,就是百分比,比如原来是 80%, 改造后 70%。
    zhaoziyuan1989
        3
    zhaoziyuan1989  
       2024-02-01 22:18:13 +08:00 via Android
    可能是在说 percent?
    ikas
        4
    ikas  
       2024-02-01 22:27:18 +08:00
    虚拟线程最大优势不就是使用传统编程模式实现异步一样的效率么?
    cabing
        5
    cabing  
       2024-02-01 22:29:44 +08:00
    你的版本升级好快了啊。好多项目都是 java8😂java15 都没有
    hepin1989
        6
    hepin1989  
    OP
       2024-02-01 22:31:36 +08:00
    @ikas 我觉得并没有,日常还是写 Flux/Pekko Stream 快一点,而且我在 ConcurrentHashMap 上遇到了 pin Carrier thread 。无解,如果改成全异步的 cache ,反而 CPU 的收益只有 5 个百分点了。
    lmshl
        7
    lmshl  
       2024-02-01 22:47:58 +08:00
    https://imgur.com/a/ZyMpzTR
    在用了在用了,我现在就写 vt
    winterbells
        8
    winterbells  
       2024-02-01 22:49:04 +08:00 via Android   ❤️ 1
    第一次见到百分比用 pt 表示…这是缩写还是扩写了%
    kkwa56188
        9
    kkwa56188  
       2024-02-01 23:13:10 +08:00
    If it ain't broke, don't fix it.
    如果是生产环境:
    非必要不更新,
    非必要不升级,
    非必要不用新 feature.
    跑的好好的东西, 能不动就不动, 一个小版本号都不动.

    如果自己折腾, 那随意.
    BBCCBB
        10
    BBCCBB  
       2024-02-01 23:19:11 +08:00
    你本来就是异步代码, 提升空间不大.

    而且 jdk21 还没 ScopedValue, 不完善.
    ikas
        11
    ikas  
       2024-02-01 23:19:22 +08:00
    锁的问题需要库,框架适配
    毕竟虚拟线程 21 才正式发布,锁与 ThreadLocal 是上生产的最大阻碍

    我们基础框架已经升级到了 21,几个项目陆续也升级了,但是虚拟线程只在一个新项目测试版本中开启..
    ByteCat
        12
    ByteCat  
       2024-02-01 23:19:33 +08:00
    项目都用 Kotlin 写的……换到 Java21 有用吗
    gongxuanzhang
        13
    gongxuanzhang  
       2024-02-02 00:35:14 +08:00
    我觉得线程池换成虚拟线程性能优化是 0
    如果你是 new 出来的线程倒是能优化..
    hepin1989
        14
    hepin1989  
    OP
       2024-02-02 01:17:43 +08:00
    @ByteCat 有啊,虚拟机的改进还是不小的。不过语法就是抄袭 Kotlin 的,提鞋都不配。
    hepin1989
        15
    hepin1989  
    OP
       2024-02-02 01:18:16 +08:00
    @BBCCBB 是的,目前我也是这样认为的。
    lidashuang
        16
    lidashuang  
       2024-02-02 01:18:36 +08:00
    @kkwa56188 总有一天没法维护
    hepin1989
        17
    hepin1989  
    OP
       2024-02-02 01:22:05 +08:00
    @lidashuang 改动很小的,不超过 30 行代码老师。
    tramm
        18
    tramm  
       2024-02-02 08:24:48 +08:00
    21 都没升呢
    echo1937
        19
    echo1937  
       2024-02-02 08:32:42 +08:00
    @gongxuanzhang 结构化并发实装前,确实少些个意思。即便如此,虚拟线程比线程池灵活,而且即使是线程池,也有 corePoolSize/maximumPoolSize 等问题,该 new 的时候还会 new ,总之还是乐见于多一种方式的。
    dbpe
        20
    dbpe  
       2024-02-02 08:45:12 +08:00
    @ikas 了解下 JEP 453 Structural Concurrency 。。
    dbpe
        21
    dbpe  
       2024-02-02 08:46:45 +08:00   ❤️ 1
    Java 的虚拟线程。。。emmm 。。。哎。。。

    什么时候可以像 kt 一样。。await 直接用。。
    BeiChuanAlex
        22
    BeiChuanAlex  
       2024-02-02 08:54:56 +08:00
    协程?

    现在还在用 jdk 8 的路过~~~~~~~~~~~
    Dragonphy
        23
    Dragonphy  
       2024-02-02 09:00:55 +08:00
    @lmshl 你的图漏信息了
    Dragonphy
        24
    Dragonphy  
       2024-02-02 09:03:07 +08:00
    Java 21 虚拟线程的陷阱:我们在 TPC-C for PostgreSQL 中遭遇死锁
    https://mp.weixin.qq.com/s/BfDd08j2jQwIOSaxf_mgww
    zed1018
        25
    zed1018  
       2024-02-02 09:14:07 +08:00   ❤️ 2
    @kkwa56188 请问不升级等到 CVE 高风险漏洞的时候一下升炸十天半个月都 migrate 不完怎么办。怎么老是有这种思想,breaking changes 应该是早发现早治疗,一定要等债务大到爆炸才解决,是想着反正我就干一两年,相信后人的智慧吗?
    cloudyplain
        26
    cloudyplain  
       2024-02-02 09:21:18 +08:00
    个人感觉:虚拟线程最大好处是对编程友好(特别是异步,不借助语法糖实现 await),性能方面:对异步(netty 、vert.x)甚至可能下降,同步也不见得有多少显著提升(一般是业务代码占大头,helloworld 除外)
    yooomu
        27
    yooomu  
       2024-02-02 09:27:41 +08:00
    在一个数据迁移的项目下试用了一下,高度 IO 密集型,使用传统线程池并发根本上不去,CPU 占用过山车。换用虚拟线程,CPU 稳定吃满,迁移效率大幅提升
    Goooooos
        28
    Goooooos  
       2024-02-02 09:29:00 +08:00
    percent 缩写一般是 pct ,建议别乱缩写,用%谁都看得懂
    ljsh093
        29
    ljsh093  
       2024-02-02 09:33:27 +08:00
    @lmshl #7 公网数据库 ip 也往外发?
    ychost
        30
    ychost  
       2024-02-02 09:34:39 +08:00
    虚拟线程对异步本来就没有提升,可能还会下降,对同步代码提升很大
    jjianwen68
        31
    jjianwen68  
       2024-02-02 09:49:21 +08:00
    原本多线程的程序,话说要怎么用虚拟线程,在每个线程耗时处理的地方再开虚拟现场处理,进一步提升效率吗
    liouop
        32
    liouop  
       2024-02-02 10:22:40 +08:00
    目前项目还在 jdk11 kotlin1.9 。。想知道大家的虚拟线程的使用场景都是用来做什么 并发请求数据、数据库 or 计算处理?
    wocanmei
        33
    wocanmei  
       2024-02-02 10:41:35 +08:00
    感觉内存和 cpu 优化不明显,用处不大吧
    wanguorui123
        34
    wanguorui123  
       2024-02-02 10:47:30 +08:00
    大部分情况下瓶颈在数据库
    yidinghe
        35
    yidinghe  
       2024-02-02 10:48:53 +08:00
    虚拟线程的好处,一是降低操作系统负担,方便虚拟机自行根据硬件资源调整;二是因为减少了异步代码,可以更方便的使用 ThreadLocal 等工具。总之,它在设计编码方面带来的负担降低是非常显著的。
    zhady009
        36
    zhady009  
       2024-02-02 12:07:59 +08:00 via iPhone
    虚拟线程不会让你的代码变快而且还会变慢些,主要还是能提供吞吐量 CPU 利用率,而且代码风格不用变还是同步的写法
    UNCLOSABLE
        37
    UNCLOSABLE  
       2024-02-02 16:12:43 +08:00
    @yooomu 哦?能不能描述以下实现方案啊,感觉很有用啊
    yooomu
        38
    yooomu  
       2024-02-02 17:02:25 +08:00
    @UNCLOSABLE 就是把原来的使用传统线程池的地方换成调用 Executors.newVirtualThreadPerTaskExecutor()使用虚拟线程执行任务,然后使用 Semaphore 来控制并发量,使用起来和传统线程没多大区别。因为需要从另一个服务器拉数据,一开始没控制并发量,直接把那台服务器干崩了,可见虚拟线程还是挺猛的
    zjcoding
        39
    zjcoding  
       2024-02-02 17:17:06 +08:00
    @lmshl #7
    是担心 V 友们黑不掉你的数据库吗
    Paracosm
        40
    Paracosm  
       2024-02-02 17:25:54 +08:00
    @lmshl ip 没遮
    BeautifulSoap
        41
    BeautifulSoap  
       2024-02-02 17:27:33 +08:00
    公司目前所有项目推荐的版本依旧还只是 17 LTS ,估计还要过段时间才迁移到 21 LTS
    Paracosm
        42
    Paracosm  
       2024-02-02 17:27:38 +08:00
    如果原先就是做异步处理的话,感觉提升相差无几
    silentsky
        43
    silentsky  
       2024-02-02 18:10:07 +08:00 via Android
    至少还是有提升的嘛
    linvaux
        44
    linvaux  
       2024-02-02 18:24:29 +08:00
    你发任你发,我用 java8
    youyang
        45
    youyang  
       2024-02-02 18:27:35 +08:00
    @linvaux 现在主流是 11 了
    wygplay
        46
    wygplay  
       2024-02-02 18:27:48 +08:00
    Java 21 虚拟线程适合执行 IO 密集型任务,优势在于提高应用吞吐量
    yef
        47
    yef  
       2024-02-03 01:01:32 +08:00
    Java8 ,生产非必要不升级,没人主导,没人审批,没法汇报
    wlm201219
        48
    wlm201219  
       364 天前
    只有 io 密集型任务,并发量非常大,并且原来的代码会阻塞线程的时候,虚拟线程的效果才会比较明显。但现实中,这种情况已经有了其它的解决方式,就是开发上很麻烦
    siweipancc
        49
    siweipancc  
       364 天前 via iPhone
    io 并发的效率高,但是内存吃的哗哗的,最重要的结构化并发还没落地,使用场景有限
    lmshl
        50
    lmshl  
       363 天前
    @Dragonphy
    @ljsh093
    @zjcoding
    @Paracosm
    谢谢提醒,随便黑,开发环境的跳板机而已
    pcdd
        51
    pcdd  
       306 天前
    @liouop 爬虫很舒服
    pcdd
        52
    pcdd  
       306 天前
    用了爬虫速度变快了,内存占用也减小不少,代码行数也省了,很香
    分代 zgc 开启了吗?使用虚拟线程时,必须使用分代 zgc ,否则 gc 压力比过去大很多
    我最开始没开,反而变慢了,开了后就快了
    pcdd
        53
    pcdd  
       306 天前
    @echo1937 对,之前个人项目这两个参数调了半天 cpu 利用率才达到一个高值,结果换成虚拟线程后更高了。。而且内存占用也低了几百 M ,这种情况还用啥平台线程,虚拟线程真香
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1732 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 01:49 · PVG 09:49 · LAX 17:49 · JFK 20:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.