26年2月极兔极致供应链 Java开发工程师 一面
1. Java中“值传递”本质:对象作为参数传递时,修改属性为何外部可见?
思路
先明确Java“值传递”的核心(传递的是变量的副本),再区分“对象引用副本”和“对象本身”的关系。
回答示例
Java只有值传递,对象作为参数传递时的核心逻辑:
- 值传递的本质:传递的是“对象引用的副本”(而非对象本身),比如
void test(User u),传入的是u这个引用变量的副本,两个引用都指向堆中同一个对象; - 修改属性外部可见的原因:
一句话总结:传递的是引用副本,修改副本指向的对象属性,等同于修改原对象;修改副本本身,与原对象无关。
2. CopyOnWriteArrayList写操作全程加锁,为何读操作无需加锁?
思路
核心讲“写时复制”机制,读操作访问的是不可变的旧数组,无线程安全问题。
回答示例
CopyOnWriteArrayList的核心是写时复制(COW),读无需加锁的原因:
- 写操作逻辑:
- 读操作逻辑:
代价:写操作有复制数组的性能开销,适合读多写少场景。
3. ThreadLocal内存泄漏的根源:弱引用仅作用于Key,Value如何清理?
思路
先讲ThreadLocalMap的结构(Key=弱引用ThreadLocal,Value=强引用),再讲Value泄漏的原因和清理机制。
回答示例
1. 内存泄漏根源
ThreadLocalMap中:
- Key:对ThreadLocal的弱引用(GC时若无强引用指向ThreadLocal,Key会被回收);
- Value:对实际值的强引用(即使Key被回收,Value仍被ThreadLocalMap强引用,无法回收);
- 最终导致:ThreadLocalMap中出现“Key为null、Value不为null”的无效条目,长期占用内存→内存泄漏。
2. Value的清理机制
- 主动清理:调用
ThreadLocal.remove(),会删除当前ThreadLocal对应的Key和Value,是最推荐的方式; - 被动清理:
核心建议:使用完ThreadLocal后务必调用remove(),尤其是线程池场景。
4. JDK8后方法区由元空间实现,元空间内存溢出的典型触发场景?
思路
先讲元空间存储内容(类元数据、常量池等),再分析溢出的核心场景(类加载过多、内存限制过小)。
回答示例
元空间(Metaspace)存储类的元数据(类结构、方法、字段)、运行时常量池等,溢出的典型场景:
- 频繁动态生成类:
- 热部署频繁:
- 元空间内存限制过小:
- 框架/中间件类加载异常:
溢出表现:抛出java.lang.OutOfMemoryError: Metaspace,且频繁触发Full GC(元空间满会触发Full GC)。
5. InnoDB聚簇索引中,二级索引的叶子节点存储什么内容?
思路
先讲聚簇索引(主键索引)的结构,再明确二级索引叶子节点的“主键值”核心内容。
回答示例
InnoDB的聚簇索引(主键索引)叶子节点存储整行数据,二级索引(非主键索引)的叶子节点存储:
- 主键值(而非整行数据) + 二级索引列的值。
查询流程:
- 用二级索引查询时,先找到二级索引叶子节点的主键值;
- 再通过主键值去聚簇索引中查找整行数据(回表查询);
- 若查询的字段都在二级索引中(覆盖索引),则无需回表。
核心:二级索引依赖主键索引实现,因此InnoDB表建议设置自增主键(减少索引分裂),且主键长度不宜过长(否则二级索引体积过大)。
6. @SpringBootApplication隐含的@EnableAutoConfiguration如何生效?
思路
讲@EnableAutoConfiguration的核心(SpringFactoriesLoader加载自动配置类),结合@SpringBootApplication的注解组合。
回答示例
@SpringBootApplication是组合注解,包含@EnableAutoConfiguration,其生效流程:
- 注解触发:@EnableAutoConfiguration通过@Import(AutoConfigurationImportSelector.class)导入自动配置选择器;
- 加载配置类:AutoConfigurationImportSelector通过
SpringFactoriesLoader扫描所有jar包中META-INF/spring.factories文件,读取org.springframework.boot.autoconfigure.EnableAutoConfiguration对应的自动配置类全限定名; - 条件筛选:Spring对加载的自动配置类,通过@ConditionalOnClass/@ConditionalOnMissingBean等注解做条件判断,仅满足条件的类才会注册到容器;
- 生效:符合条件的自动配置类中的@Bean被初始化,完成自动配置(如数据源、Web容器自动配置)。
7. MyBatis二级缓存默认开启吗?跨SqlSession是否共享?
思路
明确默认状态(未开启),再讲二级缓存的作用域(Mapper级)和跨SqlSession共享规则。
回答示例
1. 默认状态
MyBatis二级缓存默认不开启:
- 全局配置:
mybatis.configuration.cache-enabled默认true(允许开启二级缓存),但需在Mapper.xml中添加<cache/>或在Mapper接口上加@CacheNamespace才会真正启用; - 若未配置
<cache/>,二级缓存始终不生效。
2. 跨Sq
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
本专栏在精不在多,内容分为八股文、大厂真实面经,面试通过后将offer和面试题私发给我,可退还专栏的收益部分费用。欢迎大家共建专栏
