昆仑弟子_面霸
08-12·后端开发·10年+
面试吊打面试官
面试官:说说JDK21的虚拟线程是什么?我:简单说,它是一种轻量级线程,由 JVM 调度,不是一对一映射操作系统的原生线程。一个虚拟线程在执行IO的时候会被挂起,让出底层的载体线程去跑别的虚拟线程,等IO好了再恢复面试官:和传统线程池比,区别在哪里?我:线程池本质是复用一批OS线程,数量受限于内存和上下文切换成本,一般几十到几百就到头了。虚拟线程可以轻松起几十万个,因为它的栈是在堆上按需分配的,挂起时几乎不占资源面试官:那我是不是可以直接把线程池全换成虚拟线程就好了?我:这还是要看场景来的。虚拟线程适合IO密集型场景,比如HTTP调用、数据库查询。如果是CPU密集的,用虚拟线程反而没好处,载体线程数量就那么多,算力不会变多面试官:虚拟线程是怎么挂起和恢复的?我:底层用的是ForkJoinPool作为carrier,虚拟线程在执行到阻塞操作时,如果这个操作被JDK适配过,它会把栈帧拷到堆上,然后unmount,载体线程就能去跑下一个。恢复时再mount回来面试官:那如果我用了一个没适配的阻塞库,会有什么问题吗?我:这就是个坑。没适配的阻塞操作会让载体线程一起阻塞住,虚拟线程退化为平台线程,吞吐直接掉下来。比如老版本的JDBC驱动、一些原生调用,都有这个问题面试官:还有别的坑吗?我:有。比如JDK21里虚拟线程进入synchronized块时会pin住载体线程,没法unmount,高并发下会退化;还有ThreadLocal,虚拟线程数量大,如果每个都塞一堆ThreadLocal数据,堆内存会涨得很快
发布于 广东
2
评论
3
未登录
友善发言
评论
加载中
下载脉脉APP,成就职业梦想
违法不良信息&未成年人有害信息举报电话/客服电话:400 065 0808
违法不良信息&未成年人有害信息举报邮箱/客服邮箱:maimai@taou.com
清朗系列专项行动相关违规信息举报电话:400 065 0808,举报邮箱:maimai@taou.com
个人/企业等被诽谤侮辱、人身权或知识产权等被侵犯、网络谣言的举报地址:maimai.cn/tousu | 涉企虚假不实信息举报投诉专区
京ICP备12005786号-1copyright©maimai.cn