当前位置: 首页 > news >正文

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)

题目

  1. G1调优实战
    针对32GB堆的电商系统,如何设置G1相关参数平衡吞吐量(>92%)和延迟(<200ms)?给出关键参数计算公式

  2. 内存泄漏排查
    给出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:内存泄漏排查
诊断流程

  1. jmap -dump:format=b,file=heap.hprof <pid>

  2. MAT分析:

    • Dominator Tree → 找到占用最大的ThreadLocal对象

    • Path to GC Roots → 查看未被清理的引用链

    • OQL查询:SELECT * FROM java.lang.ThreadLocal WHERE @retainedHeapSize > 1000000

  3. 修复代码:

try {threadLocal.set(user);
} finally {threadLocal.remove(); // 必须清理
}

⚡ 五、Java并发

题目

线程池资源管理
分析ThreadPoolExecutor在corePoolSize=10、maxPoolSize=100、queueCapacity=1000配置下可能出现的四种资源耗尽场景,给出饱和策略选型建议

答案:

题目1:线程池资源耗尽场景
四种耗尽场景

  1. 任务队列满(queueCapacity=1000)且工作线程≥maxPoolSize

  2. 线程池处于SHUTDOWN状态

  3. 任务执行抛出未处理异常导致线程终止

  4. 饱和策略选择不当(如DiscardPolicy静默丢弃)

饱和策略选型

策略适用场景
AbortPolicy需快速失败(默认)
CallerRunsPolicy避免任务丢失
DiscardOldestPolicy允许丢弃旧任务

🌱 六、Spring框架(Spring Boot 3.2)

题目

  1. 事务失效场景
    解释@Transactional在私有方法、异常类型错误、多线程调用等场景失效的原因,给出5种解决方案

  2. 安全加固实战
    如何通过Spring Security + Bucket4j实现接口级的防暴力破解?给出登录接口的限流配置

  3. 性能监控设计
    如何通过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整合(选修)

题目

  1. 流式响应优化
    如何通过Spring WebFlux的SseEmitter实现大模型生成结果的实时流式传输?设计背压处理机制

  2. 本地模型部署
    如何在Spring Boot中集成本地部署的Llama-3模型?给出GPU内存优化方案

  3. 安全防护设计
    如何通过@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分布式锁/位移管理
JVMG1调优/内存泄漏排查
并发线程池优化/并发工具对比
Spring事务失效/安全限流/监控埋点
大模型流式传输/本地部署/安全防护
http://www.lryc.cn/news/626353.html

相关文章:

  • GB 45672-2025《车载事故紧急呼叫系统》标准发布对蜂窝模组企业带来新的增加空间
  • AI时代SEO关键词优化新策略
  • 【NFTurbo】基于Redisson滑动窗口实现验证码发送限流
  • CentOS7 离线一键安装 MySQL 8.0
  • SpringBoot前后端token自动续期方案
  • nginx-下载功能-状态统计-访问控制
  • 开源的实时 Web 日志分析器GoAccess安装使用指南
  • 鸿蒙安卓前端中加载丢帧:ArkWeb分析
  • Vue3全局配置Loading的完整指南:从基础到实战
  • electron进程间通信-从主进程到渲染器进程
  • PyTorch API 3 - distributed
  • 实时视频技术选型深度解析:RTSP、RTMP 与 WebRTC 的边界
  • SpringWeb详解
  • Causal-Copilot: An Autonomous Causal Analysis Agent 论文解读
  • Nginx 作为反向代理时设置的请求头
  • 深度解析:RESTful API中的404错误 - 不是所有404都是Bug
  • 安路EF2系列芯片单口ram ip核使用方法
  • 记录 docker容器打包成镜像 在其他服务器快速启动镜像和容器
  • 零基础学Java第二十二讲---异常(2)
  • KV cache
  • 在Excel和WPS表格中制作可打印的九九乘法表
  • MySQL事务及原理详解
  • MySQL 数据与表结构导出 Excel 技术文档
  • 如何使用matlab将目录下不同的excel表合并成一个表
  • python中view把矩阵维度降低的时候是什么一个排序顺序
  • 系统架构设计师备考第1天——系统架构概述
  • 深入Linux内核:架构设计与核心功能解析
  • 车联网(V2X)中万物的重新定义---联网汽车新时代
  • 自动驾驶汽车机器学习安全实用解决方案
  • RK android14 Setting一级菜单IR遥控器无法聚焦问题解决方法