常见的垃圾收集器有哪些?如何选择?

Serial/ParNew(年轻代,单线程/多线程);Parallel Scavenge + Parallel Old(吞吐量优先);CMS(低延迟,已废弃);G1(分区、可预测停顿,JDK9+默认);ZGC/Shenandoah(超低暂停,TB级堆)。选择依据:吞吐量优先选Parallel,低延迟选G1或ZGC。

如何排查CPU占用过高或线程死锁?

top定位Java进程,top -Hp pid定位线程。

jstack pid获取线程快照,分析线程状态(RUNNABLE, BLOCKED, WAITING)。

查找死锁:jstack输出中搜索deadlock,或使用jconsole可视化工具。

类加载的过程是怎样的?

加载(Loading)→ 验证(Verification)→ 准备(Preparation)→ 解析(Resolution)→ 初始化(Initialization)→ 使用 → 卸载。

如何理解JVM内存模型(JMM)?

定义了线程工作内存和主内存的交互规则,核心是原子性、可见性、有序性。volatile保证可见性与有序性(内存屏障),synchronizedLock保证三者。

有哪些常见的JVM性能调优参数?

-Xms/-Xmx(堆初始/最大大小);-Xmn(新生代大小);-XX:SurvivorRatio(Eden/Survivor比例);-XX:+UseG1GC(指定收集器);-XX:+HeapDumpOnOutOfMemoryError(OOM时转储堆快照)。

并发编程高级考点

volatile关键字解决了什么问题?底层如何实现?

解决可见性和禁止指令重排序。底层通过内存屏障(Memory Barrier)实现,写操作后插入Store屏障,读操作前插入Load屏障。

ThreadLocal的原理是什么?为什么会内存泄漏?

每个Thread内部有ThreadLocalMap,以ThreadLocal为键存储值。泄漏原因:ThreadLocal对象被回收后,MapEntry的键为null,但值仍被强引用。必须调用remove()

AQS(AbstractQueuedSynchronizer)的原理是什么?

ReentrantLockCountDownLatch等同步器的基础。核心是一个volatile int state(状态)和一个CLH双向队列。通过CAS修改state,失败则线程入队阻塞。

ConcurrentHashMap如何保证线程安全?

JDK7:分段锁(Segment)。JDK8:synchronized锁链表/红黑树头节点 + CAS(putVal时)。粒度更细,并发度更高。

CompletableFuture的核心优势是什么?

组合式异步编程。可方便地进行任务链式调用(thenApply)、组合(thenCompose)、合并(thenCombine)、以及异常处理(exceptionally),避免“回调地狱”。

Spring框架深入

Spring如何解决循环依赖?

通过三级缓存。一级缓存(单例池)、二级缓存(早期暴露对象)、三级缓存(ObjectFactory)。构造器注入无法解决循环依赖,需用Setter/字段注入。

Spring事务的传播机制有哪些?常用的是哪几种?

REQUIRED(默认,有则加入,无则新建)、REQUIRES_NEW(新建事务,挂起当前)、NESTED(嵌套事务)、SUPPORTSNOT_SUPPORTEDMANDATORYNEVER。常用REQUIREDREQUIRES_NEW

Spring Boot自动配置的原理是什么?

核心是@SpringBootApplication中的@EnableAutoConfiguration。它通过spring.factories文件加载自动配置类(XXXAutoConfiguration),这些类使用@ConditionalOnXxx条件装配Bean。

Spring中Bean是线程安全的吗?

默认单例Bean是非线程安全的,因其成员变量是共享状态。可通过:1. 设置作用域为prototype;2. 使用ThreadLocal;3. 避免在Bean中定义可变成员变量。

Spring MVC中@Autowired@Resource的区别?

@Autowired按类型注入,是Spring注解,结合@Qualifier可按名称。@Resource按名称注入,是JSR-250标准注解,默认按字段名/name属性匹配。

数据库与SQL优化

数据库索引的原理是什么?什么情况下会失效?

原理:B+树(InnoDB),加速检索。失效场景:对索引列进行计算/函数操作、使用!=<>like%开头、类型转换、最左前缀原则不满足、or条件有一边无索引。

什么是覆盖索引?有什么好处?

查询的列均包含在索引中,无需回表。好处:减少IO,提升查询速度。EXPLAINExtra列会显示Using index

数据库三大范式是什么?

一范式(1NF):列不可再分。二范式(2NF):非主属性完全依赖主键(消除部分依赖)。三范式(3NF):非主属性不传递依赖主键(消除传递依赖)。反范式设计常用于性能优化。

MySQL的InnoDB和MyISAM的区别?

InnoDB:支持事务、行锁、外键、聚簇索引(数据和索引一起),适合写多、高并发。MyISAM:不支持事务、表锁、非聚簇索引,适合读多、低并发。

如何做SQL优化?

  1. EXPLAIN分析执行计划。

  2. 建立合适索引,避免失效。

  3. 避免SELECT *,用覆盖索引。

  4. 优化分页:大偏移量时用id > last_max_id LIMIT n

  5. 小表驱动大表(IN子查询时,外层小表;EXISTS时,内层小表)。

  6. 用连接(JOIN)代替子查询。

分布式与微服务基础

CAP理论是什么?

分布式系统中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)三者不可兼得。CP(如ZooKeeper)、AP(如Eureka)、CA(单机系统)。网络分区P一定存在,因此通常在CP和AP间权衡。

BASE理论是什么?

基本可用(Basically Available)、软状态(Soft State)、最终一致性(Eventually Consistent)。是对CAP中AP方案的延伸,通过牺牲强一致性保证高可用。

微服务网关(如Gateway)的作用是什么?

路由转发、负载均衡、统一鉴权、限流熔断、日志监控。是系统的统一入口。

服务熔断和降级的区别?

熔断(Circuit Breaking):调用链中下游服务故障,快速失败,防止雪崩(如Hystrix、Sentinel)。降级(Fallback):自身服务在高峰期主动关闭非核心功能,保证核心功能可用。

Spring Cloud和Dubbo的核心区别?

Spring Cloud:一站式微服务生态(Netflix系、Alibaba系),基于HTTP(REST),功能全面(配置、网关、链路追踪)。Dubbo:高性能RPC框架,基于TCP,性能更高,但生态组件需整合。

缓存与消息队列

Redis为什么快?

  1. 内存操作。2. 单线程避免上下文切换(6.0后多线程仅处理网络IO)。3. 高效数据结构(SDS、跳表、哈希表)。4. I/O多路复用。

缓存穿透、击穿、雪崩的区别及解决方案?

穿透:查询不存在的数据。解决:布隆过滤器、缓存空值。

击穿:热点key过期瞬间大量请求直达DB。解决:互斥锁、永不过期(逻辑过期)。

雪崩:大量key同时过期。解决:随机过期时间、集群部署、永不过期。

如何保证Redis与数据库的数据一致性?

无完美方案。常用策略:1. 先更新数据库,再删缓存(Cache-Aside)。2. 延时双删。3. 用消息队列保证最终一致性。强一致性需用分布式锁,性能差。

消息队列(如Kafka/RocketMQ)的作用?

解耦、异步、削峰填谷。Kafka:高吞吐、日志场景。RocketMQ:金融级、顺序/事务消息。

如何保证消息不被重复消费(幂等性)?

利用数据库主键/唯一键约束。

生产者加全局唯一ID(消息ID),消费者端用Redis Set记录已处理ID。

业务状态机,判断状态是否已更新。

系统设计与场景题

如何设计一个短链系统?

发号器:用雪花算法或自增ID生成唯一ID。

长短链映射:将10进制ID转为62进制字符串作为短码(如sina.lt/abc123)。

存储:KV数据库(Redis)存短码->长链,关系数据库持久化。

跳转:HTTP 302重定向。

高并发:发号器用分布式ID,数据库分库分表,Redis集群缓存热点。

如何设计一个抢红包系统?

预分配:创建红包时,用算法(如二倍均值法)提前拆好金额存入Redis。

原子操作:用户抢时,用lpop从红包金额列表弹出,保证原子性。

防超抢:校验用户是否已抢过(Redis Set记录)。

异步入账:抢到后发消息到MQ,异步更新用户余额,保证最终一致性。

如何实现扫码登录?

Web端轮询状态:用户打开网页,生成唯一二维码(携带临时Token),并轮询后端状态。

App端确认:手机App扫码,获取Token,并调用后端确认登录接口。

状态变更:后端将Token状态改为“已确认”,并绑定用户身份信息

登录成功:Web端轮询到状态变更,获取用户信息,完成登录

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐