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

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

  •  
  •   hepin1989 · 329 天前 · 5720 次点击
    这是一个创建于 329 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我说一下我目前的数据:

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

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

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

    如果自己折腾, 那随意.
    BBCCBB
        10
    BBCCBB  
       329 天前
    你本来就是异步代码, 提升空间不大.

    而且 jdk21 还没 ScopedValue, 不完善.
    ikas
        11
    ikas  
       329 天前
    锁的问题需要库,框架适配
    毕竟虚拟线程 21 才正式发布,锁与 ThreadLocal 是上生产的最大阻碍

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

    什么时候可以像 kt 一样。。await 直接用。。
    BeiChuanAlex
        22
    BeiChuanAlex  
       329 天前
    协程?

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