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

AI出题人给出的Java后端面经(十七)(日更)

链接双端链表

前一篇:AI出题人给出的Java后端面经(十六)(日更)

后一篇:null

目录

链接双端链表

🔵 一、Java基础(Java 17)

答案:

🗃️ 二、持久化层(MySQL 8.0)

答案:

⚙️ 三、中间件

答案:

🧠 四、JVM(JDK 11 G1 GC)

答案:

⚡ 五、Java并发(Java 8)

答案:

🌱 六、Spring Cloud微服务

答案:

🤖 七、大模型与AI整合(选)

答案:

📌 今日知识地图


🔵 一、Java基础(Java 17)

题目

  1. Record类序列化陷阱
    当Jackson序列化Record类时,为何会出现 JsonMappingException: No serializer found for record 错误?给出三种解决方案并对比性能

答案

// 解决方案1:注册ParameterNamesModule(性能最优)
ObjectMapper mapper = new ObjectMapper().registerModule(new ParameterNamesModule());// 解决方案2:添加@JsonProperty注解(兼容性好)
public record User(@JsonProperty("id") int id, @JsonProperty("name") String name) {}// 解决方案3:自定义序列化器(灵活控制)
mapper.registerModule(new SimpleModule().addSerializer(User.class, new RecordSerializer()));

性能对比(万次序列化):

方案耗时
ParameterNamesModule42ms
@JsonProperty48ms
自定义序列化器65ms

🗃️ 二、持久化层(MySQL 8.0)

题目

  1. 索引优化实战
    针对 SELECT * FROM orders WHERE YEAR(create_time)=2025 AND status='PAID' 全表扫描问题,如何通过虚拟列+函数索引实现性能提升20倍?

  2. 死锁自动处理
    如何配置 innodb_deadlock_detect 和 innodb_lock_wait_timeout 实现死锁自动回退?给出金融系统的推荐参数值

答案

题目1:索引优化实战

-- 1. 创建虚拟列
ALTER TABLE orders ADD COLUMN create_year YEAR AS (YEAR(create_time)) VIRTUAL;-- 2. 创建联合索引
CREATE INDEX idx_status_year ON orders(status, create_year);-- 3. 优化查询
SELECT * FROM orders WHERE status='PAID' AND create_year=2025;

性能提升

  • 执行时间从 1.8s → 0.09s(提升20倍)

  • Extra: Using index condition

题目2:死锁自动处理
 

# my.cnf金融系统推荐配置
innodb_deadlock_detect = ON     # 开启死锁检测
innodb_lock_wait_timeout = 20   # 超时20秒回退(支付系统)
innodb_print_all_deadlocks = ON # 记录死锁日志
监控命令:
SHOW ENGINE INNODB STATUS;  # 查看死锁详情

⚙️ 三、中间件

a) Redis 6.2
题目
设计分布式会话集群:如何用 Redis Hash + Redisson 实现会话无缝迁移?给出集群扩容时的数据迁移方案

b) Kafka 3.5
题目
如何通过 ProducerInterceptor 实现消息发送的 P99延迟监控?设计滑动窗口统计并暴露Prometheus指标

答案

a) Redis会话迁移

// 1. 会话存储结构
RMap<String, SessionData> sessionMap = redisson.getMap("sessions");// 2. 集群扩容迁移方案
Map<String, SessionData> sessions = sessionMap.readAllMap();
redisNewCluster.getMap("sessions").putAll(sessions);// 3. 客户端重定向(双写过渡期)
sessionMap.addListener(new MapPutListener() {public void onPut(String key) {redisNewCluster.getMap("sessions").fastPut(key, sessionMap.get(key));}
});

b) Kafka延迟监控

public class LatencyInterceptor implements ProducerInterceptor<String, String> {private final SlidingWindowReservoir reservoir = new SlidingWindowReservoir(1000); // 滑动窗口@Overridepublic ProducerRecord<String, String> onSend(ProducerRecord<String, String> record) {record.headers().add("start-ts", String.valueOf(System.currentTimeMillis()).getBytes());return record;}@Overridepublic void onAcknowledgement(RecordMetadata metadata, Exception e) {long duration = System.currentTimeMillis() - Long.parseLong(new String(metadata.headers().lastHeader("start-ts").value()));reservoir.update(duration);// 暴露Prometheus指标Metrics.gauge("kafka.producer.latency.p99", reservoir.getSnapshot().get99thPercentile());}
}

🧠 四、JVM(JDK 11 G1 GC)

题目

  1. G1调优实战
    针对32GB堆的订单系统,如何设置 -XX:G1HeapRegionSize 和 -XX:MaxGCPauseMillis 平衡吞吐量(>92%)与延迟(<200ms)?

  2. 元空间泄漏急救
    给出 Metaspace OOM时快速定位类加载器泄漏的 jcmd 命令组合及MAT分析路径。

答案

题目1:G1调优实战

# 32GB堆订单系统配置:
-XX:+UseG1GC 
-XX:G1HeapRegionSize=16M       # 匹配大对象
-XX:MaxGCPauseMillis=200       # 目标暂停时间
-XX:InitiatingHeapOccupancyPercent=40  # 提前标记
-XX:G1ReservePercent=15        # 预留空间防晋升失败
-XX:ParallelGCThreads=8        # 并行线程数

效果验证

  • Young GC: 120-180ms

  • Mixed GC: <200ms

  • 吞吐量: 93.7%

题目2:元空间泄漏急救

# 1. 查看类加载器统计
jcmd <pid> VM.classloader_stats -verbose# 2. 定位未卸载代理类
jcmd <pid> GC.class_histogram | grep 'Proxy\|Generated'# 3. MAT分析路径
OQL: select * from java.lang.ClassLoader where objects(Class) > 100

⚡ 五、Java并发(Java 8)

题目

  1. 线程池资源耗尽
    分析 ThreadPoolExecutor 在 queueCapacity=Integer.MAX_VALUE 时导致OOM的四种场景,给出饱和策略最优选型

  2. CompletableFuture陷阱
    当使用 thenApplyAsync() 链式调用时,如何避免 回调地狱?给出结构化编排方案。

答案

题目1:线程池OOM预防
四种OOM场景

  1. 任务队列无限堆积

  2. 线程泄漏(未回收异常线程)

  3. 任务对象持有大内存

  4. 最大线程数设置过高

饱和策略选型

new ThreadPoolExecutor(10, 100, 60, TimeUnit.SECONDS,new LinkedBlockingQueue<>(1000),  // 限制队列new ThreadPoolExecutor.CallerRunsPolicy() // 调用者执行防OOM
);

题目2:CompletableFuture陷阱

// 结构化编排方案
CompletableFuture.supplyAsync(() -> fetchOrder()).thenApplyAsync(order -> enrichOrder(order)).thenCombineAsync(fetchUser(), (order, user) -> attachUser(order, user)).exceptionally(ex -> fallbackOrder())  // 统一异常处理.thenAccept(this::saveOrder);

优势

  • 链式调用替代嵌套回调

  • 统一异常处理

  • 清晰的数据流传递


🌱 六、Spring Cloud微服务

题目

  1. 网关动态路由
    如何通过 Spring Cloud Gateway + Nacos 实现实时路由更新?设计灰度发布的权重分流方案

  2. 零信任安全架构
    设计OAuth2.1资源服务器:如何用 JwtAuthenticationConverter 将 scope 声明转换为 GrantedAuthority

  3. 配置热更新失效
    当 @RefreshScope 无法刷新 @Value 时,如何通过 ContextRefresher 实现批量热更新?

答案:

题目1:网关动态路由

# Nacos配置 dataId: gateway-routes
[{"id": "product-service","predicates": ["Path=/product/**"],"filters": ["GrayFilter=30"] # 30%流量"uri": "lb://product-service-v2"}
]
@Bean
public RouteLocator dynamicRouteLocator(RouteLocatorBuilder builder, NacosConfigManager config) {return builder.routes().route(r -> r.path("/order/**").uri(config.getConfig("gateway.routes.order-service")).build();
}

题目2:安全权限转换

@Bean
public JwtAuthenticationConverter jwtConverter() {JwtGrantedAuthoritiesConverter converter = new JwtGrantedAuthoritiesConverter();converter.setAuthorityPrefix("ROLE_");converter.setAuthoritiesClaimName("scope"); // 解析scope字段return jwt -> new JwtAuthenticationToken(jwt, converter.convert(jwt), jwt.getSubject());
}

题目3:配置热更新

@Autowired private ContextRefresher refresher;@PostMapping("/refresh")
public void refreshConfig() {// 批量刷新所有@RefreshScope Beanrefresher.refresh();  // 强制更新@ValueEnvironment env = applicationContext.getEnvironment();((ConfigurableEnvironment) env).getPropertySources().addFirst(new MapPropertySource("manual-refresh", Collections.singletonMap("app.threshold", 100)));
}

🤖 七、大模型与AI整合(选)

题目

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

  2. 语义缓存设计
    基于 Caffeine + Redis 实现大模型响应的语义相似度缓存,给出Sentence-BERT的相似度计算方案

  3. 成本熔断系统
    如何通过 Bucket4j + Micrometer 监控Token消耗量?实现日预算$100自动熔断

答案

题目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) {emitter.send(chunk); // 流式发送}@Overridepublic void onComplete() {emitter.complete();}});return emitter;
}

背压处理

  • 通过 SseEmitter 超时(60s)断开慢客户端

  • 使用 EmitterProcessor 实现响应式背压

题目2:语义缓存设计

public class SemanticCache {private final Cache<String, String> localCache = Caffeine.newBuilder().maximumSize(10_000).build();private final RedisTemplate<String, String> redisTemplate;public String getCachedResponse(String prompt) {return localCache.get(prompt, p -> {String cached = redisTemplate.opsForValue().get(p);if (cached != null) return cached;String response = aiClient.generate(p);redisTemplate.opsForValue().set(p, response, 1, TimeUnit.HOURS);return response;});}// 语义相似度计算private boolean isSimilar(String text1, String text2) {float[] emb1 = sentenceBERT.encode(text1);float[] emb2 = sentenceBERT.encode(text2);return cosineSimilarity(emb1, emb2) > 0.92;}
}

题目3:成本熔断系统

// 1. Token计量器
Counter tokenCounter = Metrics.counter("openai.token.cost");// 2. 预算熔断器
CircuitBreaker circuitBreaker = CircuitBreaker.of("openai", CircuitBreakerConfig.custom().failureRateThreshold(80)  // 80%失败熔断.waitDurationInOpenState(Duration.ofMinutes(30)).build());// 3. 调用封装
String response = circuitBreaker.executeSupplier(() -> {int tokens = estimateTokens(prompt);if (tokenCounter.count() + tokens > 100_000) { // $100预算throw new BudgetExceededException();}tokenCounter.increment(tokens);return aiClient.generate(prompt);
});

📌 今日知识地图

模块核心考点
Java基础Record序列化+并发集合原理
MySQL函数索引优化+死锁自动处理
Redis/Kafka会话迁移+P99延迟监控
JVMG1容器调优+元空间急救
并发线程池OOM预防+异步编排
Spring Cloud动态路由+安全转换+配置热更
大模型流式传输+语义缓存+成本控制
http://www.dtcms.com/a/335672.html

相关文章:

  • 第 463 场周赛(GPT-3,Me-1)
  • Foreign-Memory Access API外部内存API
  • 混沌工程(Chaos engineering):系统韧性保障之道
  • 计算机网络 HTTPS 全流程
  • p5.js 3D 形状 “预制工厂“——buildGeometry ()
  • 【位运算】查询子数组最大异或值|2693
  • 图灵完备(Turing Complete)免安装中文版
  • 关于pygsp引发的一系列问题和实例小demo
  • ​​Vue 3 开发速成手册
  • 裸机框架:按键模组
  • macos 安装nodepad++ (教程+安装包+报错后的解决方法)
  • AI证书怎么选
  • 交叉编译 手动安装 SQLite 库 移植ARM
  • 基于Vue + Node能源采购系统的设计与实现/基于express的能源管理系统#node.js
  • JavaScript 性能优化实战大纲
  • 记SpringBoot3.x + Thymeleaf 项目实现(MVC架构模式)
  • .NET 中的延迟初始化:Lazy<T> 与LazyInitializer
  • 【Java后端】MyBatis-Plus 原理解析
  • Unity进阶--C#补充知识点--【Unity跨平台的原理】了解.Net
  • Linux | i.MX6ULL网络通信-套字节 UDP(第十八章)
  • 【牛客刷题】后缀子串字母统计:O(n)高效算法详解
  • python实现梅尔频率倒谱系数(MFCC) 除了傅里叶变换和离散余弦变换
  • 数学建模 15 逻辑回归与随机森林
  • 大上墨水屏显示器Paperlike253 Mac 特别版 使用体会
  • MySQL数据库初识
  • 黑马java八股文全集
  • AUTOSAR ARXML介绍
  • 数据结构(排序篇)——七大排序算法奇幻之旅:从扑克牌到百亿数据的魔法整理术
  • C++编程实战:高效解决算法与数据结构问题
  • 【CV 目标检测】Fast RCNN模型②——算法流程