网问答>>某度大厂面试,来学习下?
问题
已解决

某度大厂面试,来学习下?

时间:2025-11-03 12:44:27
某度大厂面试,来学习下?
最佳回答
某度大厂面试常见问题及解答如下:一、HashMap 相关问题底层数据结构HashMap 底层使用数组实现,哈希冲突通过拉链法解决(冲突节点形成链表)。当链表节点数超过 8 时,转换为红黑树以优化查询效率。哈希算法实现及原因HashMap 的哈希算法将 key 的 hashcode 的高 16 位保持不变,并与低 16 位进行异或运算。目的是在仅使用低位计算索引时,避免高位不同但低位相同导致的冲突,提升哈希分布的均匀性。常见哈希算法及特点拉链法:冲突对象形成链表,适用于冲突较多的场景。再哈希法:使用多个哈希函数依次尝试,直到找到空位,适用于需要低冲突率的场景。寻址法:通过一个哈希函数的结果按规律变化(如线性探测)寻找空位,适用于内存连续分配的场景。HashMap1.7 并发死循环问题在 1.7 版本中,扩容时链表采用头插法。若两个线程同时处理冲突节点,可能因指针错位导致链表成环。例如:线程 A 扩容时,线程 B 插入新节点,A 的 next 指针可能指向 B 的新节点,形成循环引用。二、垃圾回收器(G1 vs CMS)区别作用范围:G1 是整堆收集器,CMS 仅针对老年代。算法:G1 整体采用标记-整理,局部标记-复制;CMS 采用标记-清除。碎片问题:G1 无碎片,CMS 可能产生碎片。目标:G1 降低停顿时间,CMS 提高吞吐量。G1 停顿时间判断根据用户设置的最大停顿时间(如 200ms),G1 动态选择回收的 Region 数量,时间越长回收的 Region 越多。G1 的垃圾回收成本判断通过可达性分析标记垃圾,在重新标记阶段计算每个 Region 的回收成本(如存活对象比例),优先回收成本低的 Region。三、线程池相关问题核心线程数与最大线程数的区别核心线程数在空闲时不会被销毁,最大线程数在任务完成后会被销毁。核心线程数与最大线程数的确定根据业务预期 QPS 和接口性能计算:核心线程数 = 预期 QPS / (1000ms / 接口平均耗时)例如:预期 QPS=10000,接口耗时=200ms,则核心线程数=10000/(1000/200)=20。最大线程数需结合压测调整,避免资源浪费或任务堆积。队列选择:有界 vs 无界,阻塞 vs 非阻塞有界阻塞队列:控制等待线程上限,避免 OOM,适合高并发场景(如 ArrayBlockingQueue)。无界队列:可能导致 OOM,适合请求量可控的场景(如 LinkedBlockingQueue)。阻塞 vs 非阻塞:阻塞队列通过锁控制并发,释放 CPU 资源;非阻塞队列(如 ConcurrentLinkedQueue)并发高时浪费 CPU,低并发时自旋优化性能。淘汰策略及场景丢弃最新/最老任务:适用于日志收集等低优先级任务。抛异常:适用于需要二次处理的场景(如路由到异步 MQ)。调用节点执行:适用于重要任务,但需避免线程池过载导致服务不可用。线上问题案例核心线程不足:队列堆积导致超时。队列选择错误:无界队列引发 OOM,非阻塞队列导致 CPU 飙高。淘汰策略不当:调用节点执行占用过多线程,突破线程池隔离限制。四、其他问题G1 与 CMS 的适用场景G1 适合需要低停顿时间的业务(如实时系统),CMS 适合高吞吐量场景(如批量处理)。线程池参数调优建议初始设置基于公式计算,通过压测调整核心线程数、队列大小和最大线程数,监控 CPU、内存和任务队列长度。以上内容覆盖了 HashMap、垃圾回收器、线程池的核心面试点,结合原理与实际场景,助你高效备考。
时间:2025-11-03 12:44:35
本类最有帮助
Copyright © 2008-2013 www.wangwenda.com All rights reserved.冀ICP备12000710号-1
投诉邮箱: