AI出题人给出的Java后端面经(二十)(日更)
链接双端链表
前一篇:AI出题人给出的Java后端面经(十⑨)(日更)
后一篇:null
目录
🔵 一、Java基础(集合/流式/OOP)
答案:
🗃️ 二、持久化层(MySQL 8.0)
答案:
⚙️ 三、中间件
答案:
🧠 四、JVM(JDK 11 G1 GC)
答案:
⚡ 五、Java并发
答案:
🌱 六、Spring框架(Spring Boot 3.2)
答案:
🤖 七、大模型与AI整合(选修)
答案:
📌 今日知识地图
🔵 一、Java基础
题目:
流式编程性能
分析以下代码的性能瓶颈并提出两种优化方案:
List<String> result = dataList.stream().filter(s -> s.length() > 10).map(String::toUpperCase).sorted().collect(Collectors.toList());
答案:
题目2:流式编程性能优化
// 优化方案1:避免不必要的排序 List<String> result = dataList.stream().filter(s -> s.length() > 10).map(String::toUpperCase).collect(Collectors.toCollection(() -> new ArrayList<>(dataList.size()))); // 预设容量// 优化方案2:并行流处理(数据量>10万时) List<String> result = dataList.parallelStream().filter(s -> s.length() > 10).map(String::toUpperCase).collect(Collectors.toList());
性能对比(百万数据):
优化前:620ms(含排序开销)
优化后1:380ms(无排序+预设容量)
优化后2:210ms(并行流)
🗃️ 二、持久化层(MySQL 8.0)
题目:
死锁分析与预防
分析并发事务中 UPDATE account SET balance = balance - 100 WHERE user_id = 1
和 UPDATE account SET balance = balance + 100 WHERE user_id = 2
发生死锁的场景,给出解决方案。
答案:
死锁分析与预防
死锁场景:
事务A:UPDATE account SET balance = balance - 100 WHERE user_id = 1
事务B:UPDATE account SET balance = balance + 100 WHERE user_id = 2
→ 间隙锁冲突导致死锁解决方案:
-- 方案1:调整事务隔离级别 SET TRANSACTION ISOLATION LEVEL READ COMMITTED;-- 方案2:统一更新顺序 UPDATE account SET balance = balance - 100 WHERE user_id IN (1,2) ORDER BY user_id;
⚙️ 三、中间件
a) Redis 6.2
题目:
设计分布式锁续期机制:如何用Redisson的watchDog实现锁自动续期?解释锁续期失败时的容错策略
b) Kafka 3.5
题目:
如何通过ConsumerRebalanceListener实现消费位移的精准控制?设计分区再平衡时的零数据丢失方案
答案:
a) Redis分布式锁续期
RLock lock = redisson.getLock("order_lock"); lock.lock(30, TimeUnit.SECONDS); // 看门狗默认10秒续期一次// 手动续期容错 if (lock.isHeldByCurrentThread()) {try {lock.expire(30, TimeUnit.SECONDS);} catch (Exception e) {// 异步重试续期retryExpireAsync(lock);} }
续期机制:后台线程每10秒检查锁持有状态,存活则重置TTL为30秒
b) Kafka位移精准控制
consumer.subscribe(topics, new ConsumerRebalanceListener() {public void onPartitionsRevoked(Collection<TopicPartition> partitions) {// 提交位移到DB保证精确控制jdbcTemplate.batchUpdate("REPLACE INTO consumer_offsets VALUES(?,?,?,?)",partitions.stream().map(p -> new Object[]{groupId, p.topic(), p.partition(), consumer.position(p)}).collect(Collectors.toList()));}public void onPartitionsAssigned(Collection<TopicPartition> partitions) {// 从DB加载精确位移partitions.forEach(p -> consumer.seek(p, loadOffsetFromDB(p)));} });
🧠 四、JVM(JDK 11 G1 GC)
题目:
-
G1调优实战
针对32GB堆的电商系统,如何设置G1相关参数平衡吞吐量(>92%)和延迟(<200ms)?给出关键参数计算公式 -
内存泄漏排查
给出jmap + MAT分析ThreadLocal导致OOM的完整诊断流程,包括Dominator Tree和Path to GC Roots的分析方法
答案:
题目1:G1调优实战
# 32GB堆电商系统配置: -XX:+UseG1GC -XX:MaxGCPauseMillis=200 -XX:G1HeapRegionSize=16M # Region大小=堆大小/2048 -XX:InitiatingHeapOccupancyPercent=45 # IHOP = 45 - 0.5 * (年轻代占比) -XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=50 -XX:ConcGCThreads=4 # 并发线程数=MAX(ParallelGCThreads/4,1)
计算公式:
G1HeapRegionSize
= max(1M, min(32M, pow(2, log2(堆大小/2048))))
ConcGCThreads
= max(1, ParallelGCThreads/4)题目2:内存泄漏排查
诊断流程:
jmap -dump:format=b,file=heap.hprof <pid>
MAT分析:
Dominator Tree → 找到占用最大的ThreadLocal对象
Path to GC Roots → 查看未被清理的引用链
OQL查询:
SELECT * FROM java.lang.ThreadLocal WHERE @retainedHeapSize > 1000000
修复代码:
try {threadLocal.set(user); } finally {threadLocal.remove(); // 必须清理 }
⚡ 五、Java并发
题目:
线程池资源管理
分析ThreadPoolExecutor在corePoolSize=10、maxPoolSize=100、queueCapacity=1000配置下可能出现的四种资源耗尽场景,给出饱和策略选型建议
答案:
题目1:线程池资源耗尽场景
四种耗尽场景:
任务队列满(queueCapacity=1000)且工作线程≥maxPoolSize
线程池处于SHUTDOWN状态
任务执行抛出未处理异常导致线程终止
饱和策略选择不当(如DiscardPolicy静默丢弃)
饱和策略选型:
策略 适用场景 AbortPolicy
需快速失败(默认) CallerRunsPolicy
避免任务丢失 DiscardOldestPolicy
允许丢弃旧任务
🌱 六、Spring框架(Spring Boot 3.2)
题目:
-
事务失效场景
解释@Transactional在私有方法、异常类型错误、多线程调用等场景失效的原因,给出5种解决方案 -
安全加固实战
如何通过Spring Security + Bucket4j实现接口级的防暴力破解?给出登录接口的限流配置 -
性能监控设计
如何通过Micrometer + Prometheus监控Spring Boot应用的P99响应时间?给出@Timed配置和PromQL查询语句
答案:
题目1:事务失效解决方案
失效场景 解决方案 私有方法 改为public/protected 异常类型错误 @Transactional(rollbackFor=Exception.class) 多线程调用 使用TransactionTemplate 未被代理类调用 通过AopContext获取代理对象 嵌套事务传播错误 检查propagation设置 题目2:防暴力破解配
# application.yml bucket4j:enabled: truefilters:- cache-name: login_attemptsurl: /loginrate-limits:- bandwidths:- capacity: 5time: 1unit: minutes
@Bean public SecurityFilterChain filterChain(HttpSecurity http) {http.addFilterBefore(new RateLimitFilter(), UsernamePasswordAuthenticationFilter.class); }
题目3:P99监控配置
@Configuration public class MetricsConfig {@Beanpublic TimedAspect timedAspect(MeterRegistry registry) {return new TimedAspect(registry);} }@RestController @Timed(value = "api.latency", percentiles = {0.5, 0.95, 0.99}) public class ApiController {@GetMapping("/api/data")public Data getData() { ... } }
PromQL查询:
histogram_quantile(0.99, rate(api_latency_seconds_bucket[5m]))
🤖 七、大模型与AI整合(选修)
题目:
-
流式响应优化
如何通过Spring WebFlux的SseEmitter实现大模型生成结果的实时流式传输?设计背压处理机制 -
本地模型部署
如何在Spring Boot中集成本地部署的Llama-3模型?给出GPU内存优化方案 -
安全防护设计
如何通过@ControllerAdvice实现大模型提示词注入攻击的全局防护?给出正则表达式过滤方案
答案:
题目1:流式传输优化
@GetMapping("/ai/stream") public SseEmitter streamResponse(@RequestParam String prompt) {SseEmitter emitter = new SseEmitter(60_000L);aiClient.generateStream(prompt, new ResponseHandler() {@Overridepublic void onChunk(String chunk) {try {if (!emitter.isCompleted()) {emitter.send(chunk);}} catch (IOException e) {emitter.completeWithError(e);}}});return emitter; }
背压处理:通过SseEmitter超时(60s)自动断开慢客户端
题目2:本地模型部署
# application.yml ai:model:path: /models/llama-3-8bgpu-memory: 12G # GPU内存分配quantize: true # 4bit量化
@Bean public LlamaModel llamaModel() {return new LlamaModel(modelConfig.getPath(),new ModelOptions().setGpuMemory(modelConfig.getGpuMemory()).setQuantized(modelConfig.isQuantize())); }
GPU优化:4bit量化减少75%显存占用
题目3:安全防护设计
@ControllerAdvice public class PromptInjectionAdvice {private static final Pattern MALICIOUS_PATTERN = Pattern.compile("(?i)(system:|sudo|rm -rf|drop table)");@ModelAttributepublic void checkPrompt(@RequestBody String prompt) {if (MALICIOUS_PATTERN.matcher(prompt).find()) {throw new PromptInjectionException("检测到恶意指令");}}@ExceptionHandler(PromptInjectionException.class)public ResponseEntity<ErrorResponse> handleInjection(PromptInjectionException ex) {return ResponseEntity.status(400).body(new ErrorResponse(ex.getMessage()));} }
📌 今日知识地图
模块 | 核心考点 |
---|---|
Java基础 | 流式性能 |
MySQL | 死锁分析 |
Redis/Kafka | 分布式锁/位移管理 |
JVM | G1调优/内存泄漏排查 |
并发 | 线程池优化/并发工具对比 |
Spring | 事务失效/安全限流/监控埋点 |
大模型 | 流式传输/本地部署/安全防护 |