2021-10-24 21:53:44
以下是对面试相关核心问题的梳理与解答:
JVM 相关堆是线程共享区域,分为新生代(Eden、Survivor)、老年代,用于存储对象实例。
方法区(元空间)存储类信息、常量等;栈用于线程私有方法调用;程序计数器记录指令位置。
初始标记(STW)、并发标记、重新标记(STW)、并发清除。共 2 次 STW。
根集对象:包括虚拟机栈中的引用、方法区静态引用、本地方法栈引用等,作为 GC 起始点。
类加载器自底向上检查类是否已加载,防止重复加载同一字节码,确保类唯一性。
算法:标记-清除(产生碎片)、复制(新生代)、标记-整理(老年代)、分代收集。
回收器:Serial(单线程)、Parallel Scavenge(并行)、CMS(并发)、G1(分区+并发)。
面向大堆,将堆划分为多个 Region,优先回收垃圾多的区域(Mixed GC),减少 FGC 频率。
Java 对象头标记位经历无锁→偏向锁→轻量级锁→重量级锁,减少线程竞争开销。
同一线程可重复获取锁,避免死锁,支持公平/非公平模式。
线程未获取锁时循环尝试,减少线程切换开销,适用于短时间竞争场景。
保证可见性(禁止指令重排序,强制写入主存),适用于单次读写场景(如状态标志)。
参数:核心线程数、最大线程数、队列容量、存活时间、拒绝策略(如 AbortPolicy)。
拒绝策略:直接拒绝、调用者运行、丢弃队列最旧任务、丢弃最新任务。
HashMap:线程不安全,多线程可能导致数据不一致或死循环(JDK1.7 头插法)。
ConcurrentHashMap:JDK1.8 采用 CAS + synchronized 锁分段,尾插法扩容,支持高并发。
默认容量 10,扩容时容量变为原来的 1.5 倍,涉及数组拷贝。
浅拷贝复制引用,深拷贝递归复制对象所有层级。
B+树:多路平衡树,叶子节点链表连接,适合范围查询;哈希索引仅支持等值查询。
读未提交、读已提交(解决脏读)、可重复读(MVCC 解决幻读,InnoDB 默认)、串行化。
聚簇索引(主键索引)叶子节点存储数据;非聚簇索引(二级索引)叶子节点存储主键值。
避免全表扫描,添加合适索引;拆分复杂查询;使用 EXPLAIN 分析执行计划。
RDB:定时快照,适合灾难恢复;AOF:记录写操作,数据更完整但体积大。
基于 SETNX 实现,需设置过期时间防止死锁;Redlock 算法解决多实例场景问题。
穿透:空值缓存或布隆过滤器过滤无效请求;雪崩:随机过期时间或分层缓存。
Producer:发送消息;Broker:存储消息;Consumer:消费消息;ZooKeeper:管理元数据。
副本机制(ISR 列表);Leader 选举由 Controller 协调。
通过事务消息 + 幂等性 Producer 实现,确保消息不重复不丢失。
IOC:控制反转,通过依赖注入管理对象生命周期;AOP:动态代理实现横切关注点(如日志)。
基于 spring-boot-autoconfigure 模块,通过 @Conditional 注解按条件加载配置。
分治思想,选取基准值将数组分为左右两部分,递归排序,平均时间复杂度 O(n log n)。
哈希表 + 双向链表实现,访问节点移至链表头部,淘汰尾部节点。
分库分表存储红包数据;使用 Redis 原子操作扣减金额;消息队列异步处理结果。
分析堆转储文件(jmap -dump),使用 MAT 或 VisualVM 定位内存泄漏对象。
top 定位高负载进程,jstack 导出线程堆栈,分析阻塞或死循环代码。
检查线程状态(BLOCKED/WAITING),分析锁竞争或死锁(jstack)。
以上内容覆盖了 JVM、并发、数据库、框架等核心知识点,适合作为大厂面试的复习框架。 实际面试中需结合具体场景深入展开,并注重项目经验与原理理解的结合。