前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java 虚拟线程截止 2024-3-10 在 OpenJDK 还没有解决消息的问题

Java 虚拟线程截止 2024-3-10 在 OpenJDK 还没有解决消息的问题

作者头像
干货满满张哈希
发布2024-05-25 09:02:15
610
发布2024-05-25 09:02:15
举报

之前的文章《虚拟线程目前不推荐上生产的个人思考》,总结了几个目前的问题:

1. synchronized 的 pin 线程引发的问题比预期严重,或者等到 OpenJDK 修复,或者很多 Java 库要改(尤其是 JDBC 驱动这种)。目前 monitor enter 的 pin 线程问题在 Loom 的预计合入 OpenJDK 23 的分支上有了初步解决方案。

2. 虚拟线程的调度与之前的线程不一样,有些场景需要注意不适用。

3. ThreadLocal很常用很难去掉,ScopedLocal 不能解决所有问题,比如将 ThreadLocal 用作对象池的避免并发访问的场景,这种其实是想针对底层负载线程创建对象。这种一般需要三方库做修改,比如 jackson,jackson 针对这个问题的解决方式是:https://github.com/FasterXML/jackson-core/pull/1064/files#diff-0d3d4113de19d16bfce8a0fffa471b3f90096602b45d598eca91c6b226f7cf2d

一些在 Java 22 的改进:

1. 虚拟线程底层也是通过 epoll 和 kqueue 实现的非阻塞 io,相应地,肯定有 poller 线程。虚拟线程的负载线程,默认是 FoekJoinPool.common 大小也是可用 CPU 数量 - 1,再加上 poller 线程的争用。同时,如果监听事件的线程和实际的处理的线程是同一个也是更好的。所以 Java 22 也会将 poller 线程变为虚拟线程。经过测试,这个修改的提升是比较大的。

c1be01fa14f05b4f03a37c4f48c2529f.jpeg
c1be01fa14f05b4f03a37c4f48c2529f.jpeg

其实虚拟线程除了这些已知的使用问题,还有明确需要 OpenJDK 解决的问题目前还没有明确的解决方案,但应该是在解决中:

1. 只要涉及本地帧(可以理解为 JVM  C++/C 层面的调用,系统调用等等),如果是本地帧导致的阻塞,大部分都会 pin 线程。

2. 由于 1 的存在,sychronized 的首要问题解决了,但是之后的 wait notify 还是依赖 JVM 层的队列和代码,还是会 pin 线程。

3. 由于 1 的存在,虚拟线程触发类加载,还是会 pin 线程,因为类加载主要代码也是在 JVM 层做的。

4. 文件 io 的阻塞,linux 平台底层通过 io_uring 改写,但是目前整体的改写方案还没定。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-05-24,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档