2023-03-07 22:56:18
字节跳动三面核心问题及解析如下:
一面:基础技术深度考察HashMap扩容与冲突处理
扩容机制:当元素数量超过阈值(容量×负载因子)时,容量翻倍,重新计算哈希并迁移数据。
冲突解决:采用链表+红黑树(Java8+),冲突时元素挂载到链表,长度超过8转为红黑树。
高效迁移:Java8通过transfer方法并行迁移,利用CAS保证线程安全。
TCP三次握手与四次挥手
三次握手:SYN(客户端)→ SYN+ACK(服务端)→ ACK(客户端),建立双向连接。
四次挥手:FIN(主动方)→ ACK(被动方)→ FIN(被动方)→ ACK(主动方),确保数据传输完成。
同步IO vs 异步IO
同步IO:线程阻塞等待数据就绪(如read),期间无法执行其他任务。
异步IO:线程提交请求后继续执行,数据就绪后通过回调或事件通知(如Linux的epoll)。
Java GC机制与GC Roots
GC Roots:虚拟机栈中的引用、方法区静态变量、本地方法栈引用、同步锁持有的对象。
分代回收:新生代(Minor GC)用复制算法,老年代(Major GC)用标记-清除或标记-整理。
红黑树特性与操作
五个特性:根节点黑色、红色节点子节点黑色、路径黑色节点数相同、叶子节点(NIL)黑色、节点颜色非红即黑。
时间复杂度:插入/删除/查找均为O(log n),通过旋转和变色维护平衡。
排序算法复杂度
快排:平均O(n log n),最坏O(n2)(已排序数组),最好O(n log n)。
堆排序:建堆O(n),排序O(n log n),适合大规模数据。
AtomicInteger原子性实现
CAS(Compare-And-Swap):通过Unsafe类调用CPU指令,比较内存值与预期值,匹配则更新。
ConcurrentHashMap Java7 vs Java8
Java7:分段锁(Segment),并发度由Segment数量决定。
Java8:节点锁+CAS,红黑树优化冲突,并发效率更高。
使用场景:HashMap单线程或读多写少;ConcurrentHashMap高并发写场景。
Redis数据结构与淘汰机制
数据结构:字符串、哈希、列表、集合、有序集合(ZSET)。
淘汰策略:
volatile-lru:淘汰最近最少使用的易失键。
allkeys-random:随机淘汰任意键。
noeviction(默认):禁止淘汰,写操作报错。
MySQL事务与MVCC
MVCC实现:每行记录隐藏字段(创建版本号、删除版本号),通过ReadView判断可见性,实现非阻塞读。
MySQL主从同步原理
Binlog传输:主库记录Binlog,从库I/O线程拉取,SQL线程重放。
半同步复制:主库等待至少一个从库确认接收Binlog后才返回,保证数据不丢失。
InnoDB索引与B+树优势
B+树特性:
所有数据存储在叶子节点,非叶子节点仅存索引键。
叶子节点通过指针连接,支持高效范围查询。
节点大小:通常为磁盘页大小(如16KB),减少I/O次数。
Redis大Key问题与持久化
keys命令影响:O(n)时间复杂度,阻塞Redis服务,生产环境应使用SCAN。
持久化方式:
RDB:定时快照(save/bgsave),适合备份。
AOF:追加写操作日志(always/everysec/no),支持重放恢复。
最大困难与克服方法
示例:高并发场景下锁竞争问题,通过分段锁+CAS优化,性能提升50%。
未来规划
短期:深耕分布式系统与中间件。
长期:向全栈架构师发展,提升系统设计能力。
反问环节建议
技术方向:团队当前技术栈与挑战。
职业发展:晋升机制与成长路径。
