2026-10-17 10:36:34
JVM 内存分区及回收算法
答案:JVM 内存分为方法区(存储已被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据)、堆(存放对象实例)、栈(存储局部变量表、操作数栈、动态链接、方法出口等信息)、本地方法栈(为 JVM 使用到的 Native 方法服务)和程序计数器(记录当前线程所执行的字节码的行号指示器)。
回收算法:包括标记-清除(标记无用对象并清除)、标记-整理(标记无用对象后整理存活对象)、复制(将内存分为两块,每次只使用其中一块,复制存活对象到另一块并清空当前块)、分代收集(根据对象存活周期的不同将内存划分为几块,分别使用不同的算法)。
收集器:Serial(单线程)、Parallel Scavenge(多线程并行)、CMS(标记-清除,低停顿)、G1(面向服务端应用,可预测的停顿时间)。
GC 的两种判定方法及 CMS 与 G1 特点
答案:GC 的两种判定方法是引用计数法和可达性分析算法。CMS(Concurrent Mark Sweep)特点为低停顿,与应用程序线程并发执行垃圾回收;G1(Garbage First)特点为可预测的停顿时间,面向服务端应用,将堆内存划分为多个区域,优先回收垃圾最多的区域。
HashMap 源码问题
答案:HashMap 基于哈希表实现,存储键值对,允许使用 null 值和 null 键。其底层是数组+链表(JDK 8 引入红黑树优化),通过哈希函数确定元素存储位置,若发生哈希冲突则使用链表或红黑树存储冲突元素。
HashMap 线程安全及 ConcurrentHashMap
答案:HashMap 非线程安全,可通过 Collections.synchronizedMap 方法包装为线程安全的 Map,或使用 ConcurrentHashMap。ConcurrentHashMap 通过分段锁(JDK 7)或 CAS+synchronized(JDK 8)实现线程安全。
HashMap 底层结构及 put 操作
答案:底层结构为数组+链表/红黑树,put 操作时先计算 key 的哈希值,通过哈希函数确定数组索引,若该位置为空则直接存储,若发生冲突则判断链表长度,若长度超过阈值则转换为红黑树。
GC 判定方法及 CMS 与 G1 特点(重复问题)
答案:同上。
Java 线程同步方式及 CyclicBarrier 和 CountDownLatch 区别
答案:线程同步方式包括 synchronized、Lock、volatile、原子变量等。CyclicBarrier 允许一组线程互相等待,直到所有线程都到达一个共同屏障点,然后继续执行;CountDownLatch 允许一个或多个线程等待其他线程完成一系列操作。
CAS 原理及 volatile 实现原理
答案:CAS(Compare and Swap)通过比较内存中的值与预期值是否相等,若相等则更新为新值,否则不做操作,使用 native 方法实现,底层依赖 CPU 指令。volatile 修饰的变量在修改后会立即更新到主内存中,保证多线程间的可见性,但无法保证原子性。
多线程常见问题及解决方法
答案:常见问题包括死锁、线程饥饿、资源竞争等。解决方法包括避免嵌套锁、使用 tryLock 尝试获取锁、使用合理的线程池等。
MYSQL 性能分析方法
答案:使用 EXPLAIN 分析查询计划,SHOW PROCESSLIST 查看当前连接及状态,SHOW STATUS 查看服务器状态变量,SHOW VARIABLES 查看服务器配置参数,使用慢查询日志等。
通用 SQL 函数
答案:包括字符串函数(如 CONCAT、SUBSTRING)、数值函数(如 ABS、CEILING)、日期函数(如 NOW、DATE_ADD)、聚合函数(如 SUM、AVG)等。
手撕代码:按层次遍历二叉树
答案:可使用递归或迭代方式实现。递归方式通过递归函数遍历左子树和右子树,迭代方式使用队列或栈辅助实现。
Java 配置 Spring
答案:可通过 XML 配置、注解配置、Java 配置(@Configuration)等方式。
AOP 和 IOC 概念及 AOP 实现
答案:AOP(面向切面编程)通过预编译方式和运行期间动态代理实现程序功能的统一维护的一种技术;IOC(控制反转)将对象的创建和依赖关系的管理交给 Spring 容器。AOP 实现可通过 JDK 动态代理或 CGLIB 代理。
自我介绍及项目
答案:根据个人经历回答。
Spring 原理及 AOP 和 IOC 原理
答案:Spring 通过 IOC 容器管理对象的生命周期和依赖关系,通过 AOP 实现横切关注点(如日志、事务)的分离。IOC 原理基于依赖注入,AOP 原理基于动态代理。
分布式锁原理
答案:分布式锁用于保证分布式系统中多个节点对共享资源的互斥访问,常见实现方式包括基于数据库、Redis、Zookeeper 等。
CAS 算法及 CAS 与 synchronized 使用情景
答案:CAS 用于实现无锁并发控制,适用于读多写少的场景;synchronized 用于实现互斥锁,适用于写多读少或需要保证原子性的场景。
Mysql InnoDB 事务隔离级别及区别
答案:包括 READ UNCOMMITTED(读取未提交数据,可能出现脏读)、READ COMMITTED(读取已提交数据,可能出现不可重复读)、REPEATABLE READ(可重复读,默认级别,可能出现幻读)、SERIALIZABLE(串行化,最高级别,保证完全隔离)。
事务隔离级别解决问题
答案:分别解决脏读、不可重复读、幻读等问题。
Dubbo 模块及底层通信原理、负载均衡策略
答案:Dubbo 包括 Provider、Consumer、Registry、Monitor 等模块,底层通信基于 Netty 实现,负载均衡策略包括随机、轮询、一致性哈希等。
HTTPS 实现
答案:基于 SSL/TLS 协议实现,包括证书生成、证书验证、数据加密传输等步骤。
常用负载均衡及使用方法
答案:包括 Nginx、LVS、Haproxy 等,通过配置服务器地址、权重、算法等参数实现负载均衡。
分布式事务方案
答案:包括两阶段提交(2PC)、三阶段提交(3PC)、TCC(Try-Confirm-Cancel)、消息事务等。
Dubbo 核心功能及 RPC 框架设计
答案:Dubbo 核心功能包括服务注册与发现、负载均衡、服务调用、容错机制等。设计 RPC 框架需考虑通信协议、序列化方式、服务注册与发现、负载均衡、容错机制等。
一致 Hash 算法(Redis)
答案:将节点映射到哈希环上,通过顺时针查找的方式确定数据存储节点,实现数据的均匀分布和节点的动态添加与删除。
数据库索引及 B+树特性和建树过程
答案:索引用于提高查询效率,B+树是常见的索引结构,具有平衡性、多路查找、叶子节点链表相连等特点。建树过程包括节点分裂、插入元素、调整平衡等步骤。
MySQL 行锁、表锁及乐观锁、悲观锁
答案:行锁针对单行数据加锁,表锁针对整个表加锁;乐观锁通过版本号或时间戳实现,悲观锁通过数据库锁机制实现。
分布式锁方案及性能比较
答案:Redis 和 Zookeeper 均可实现分布式锁,Redis 性能较高但可靠性依赖于持久化配置,Zookeeper 可靠性较高但性能略低。集群部署下,Redis 需考虑分片及主从切换等问题,Zookeeper 具有较好的容错性和可扩展性。
ActiveMQ 发送消息方式及调优
答案:包括同步发送、异步发送、持久化发送等。调优可通过调整线程池大小、优化序列化方式、调整持久化策略等方式实现。
设计模式与重构
答案:设计模式是解决常见问题的最佳实践,包括单例模式、工厂模式、代理模式等。重构是在不改变软件外部行为的前提下,改善其内部结构,提高代码可读性、可维护性和可扩展性。
Collections.sort 底层排序方式
答案:基于 Timsort 算法实现,是归并排序和插入排序的结合体,具有稳定性、高效性等特点。
Redis 哈希槽及集群数据库选择
答案:Redis 集群通过哈希槽实现数据的分片存储,每个节点负责一部分哈希槽。选择数据库时可根据业务需求、数据量、性能等因素综合考虑。
Spring