联想简介
联想集团是全球领先的智能设备与解决方案提供商,拥有PC、服务器、智能终端等多元化业务线。技术栈以Java和Spring生态为主,近年来加速AI技术落地,在智能客服、PC端AI助手、企业级AI平台等领域持续投入。面试风格注重Java基础原理与AI工程化能力的结合,既考察传统后端的JVM调优、并发编程、分布式架构功底,也考察AI工具使用和智能体开发等前沿技术。英语沟通能力也是加分项,因常有海外团队协作。
题目1:请详细说说ConcurrentHashMap在JDK 1.7和1.8中的实现差异,以及为什么1.8要改成这种设计?
JDK 1.7的ConcurrentHashMap采用分段锁(Segment)机制,将整个Map分成16个Segment,每个Segment继承自ReentrantLock,锁粒度较粗,并发度上限为16。JDK 1.8彻底摒弃了分段锁,采用CAS + synchronized锁住数组桶的头节点,锁粒度更细,并发度大幅提升。同时引入红黑树,当链表长度超过8时转为红黑树,将查询复杂度从O(n)降到O(log n)。扩容也从1.7的逐段扩容改为1.8的多线程协助扩容,利用ForwardingNode让多个线程各自负责一段数据的迁移,提升扩容效率。
面试官常追问:ConcurrentHashMap的size()怎么统计的?用LongAdder的累加器思想,通过baseCount和CounterCell数组来维护元素个数,避免每次put都加全局锁。
题目2:新来个项目,你怎么做JVM调优?说说你的排查思路和常用工具。
JVM调优不是上来就调参数,而是先监控、再分析、最后调优的渐进过程。第一步是监控,用JDK自带的jstat、jmap、jstack收集GC频率、堆内存使用、线程状态等基础数据。第二步是分析,用VisualVM或JMC看GC日志,重点关注Full GC触发频率和STW时间。如果Old区频繁Full GC,用jmap dump出堆快照,用MAT分析是否有内存泄漏。第三步是调优,根据业务场景选择合适的GC回收器。高吞吐场景选Parallel Scavenge + Parallel Old,低延迟选G1或Z