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

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

链接双端链表

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

后一篇:null

目录

🔵 一、Java基础

答案:

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

答案:

⚙️ 三、中间件

答案:

🧠 四、JVM

答案:

⚡ 五、Java并发

答案:

🌱 六、Spring框架(Spring Boot 3.x)

答案:

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

答案:

📌 今日知识地图


🔵 一、Java基础

题目函数式编程   

 Stream 操作中 .parallel() 引发线程安全问题,如何用 Collectors.toConcurrentMap 替代实现线程安全归约?给出代码示例。

答案

Map<Integer, String> result = dataList.parallelStream().collect(Collectors.toConcurrentMap(User::getId, User::getName,(oldVal, newVal) -> oldVal  // 解决key冲突));

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

题目

  1. 索引失效场景
    解释 WHERE status = 1 OR amount > 100 导致联合索引 (status, amount) 失效的根本原因,给出两种优化方案

  2. 事务隔离实战
    在 REPEATABLE-READ 级别下,如何通过 SELECT ... FOR UPDATE SKIP LOCKED 实现高并发库存扣减?对比悲观锁与乐观锁性能差异

答案:

题目1:索引失效优化
失效原因:OR条件导致索引无法同时使用
优化方案

  1. UNION分治

    SELECT * FROM orders WHERE status = 1
    UNION ALL
    SELECT * FROM orders WHERE amount > 100 AND status != 1
  2. 生成列索引

    ALTER TABLE orders ADD COLUMN status_amount INT AS (IF(status=1 OR amount>100, 1, NULL));
    CREATE INDEX idx_status_amount ON orders(status_amount);

题目2:高并发库存扣减

START TRANSACTION;
SELECT stock FROM inventory WHERE product_id = 1001 FOR UPDATE SKIP LOCKED; -- 跳过被锁行
UPDATE inventory SET stock = stock - 1 WHERE product_id = 1001;
COMMIT;

性能对比(QPS = 1000请求):

方案平均耗时死锁概率
悲观锁35ms0.1%
乐观锁28ms12%重试

⚙️ 三、中间件

a) Redis 6.2
题目
设计分布式会话:如何用 Redis Hash + Redisson 实现会话续期踢出登录功能?给出 Lua 脚本原子操作方案

b) Kafka 3.5
题目
如何通过 ConsumerRebalanceListener 实现分区再平衡时的消费位移校准?解释 isolation.level=read_committed 防止脏读的底层机制

答案

a) Redis会话管理

-- 续期Lua脚本
local key = KEYS[1]
local newExpire = ARGV[1]
if redis.call('EXISTS', key) == 1 thenredis.call('EXPIRE', key, newExpire)return 1
end
return 0-- 踢出登录(Java代码)
RMap<String, Session> sessionMap = redisson.getMap("sessions");
sessionMap.remove(sessionId);  // 自动广播删除事件

b) Kafka位移校准
答案

consumer.subscribe(topics, new ConsumerRebalanceListener() {public void onPartitionsRevoked(Collection<TopicPartition> partitions) {// 提交当前位移consumer.commitSync(); }public void onPartitionsAssigned(Collection<TopicPartition> partitions) {// 从DB加载历史位移long offset = loadOffsetFromDB(partitions);consumer.seek(partition, offset);}
});

read_committed防脏读

  • 只暴露已提交事务的消息

  • Broker通过__transaction_state内部Topic追踪事务状态


🧠 四、JVM

题目

  1. G1 调优实战
    针对 16GB 堆内存的电商服务,如何设置 -XX:MaxGCPauseMillis 和 -XX:G1NewSizePercent 平衡吞吐量与延迟?

  2. 内存泄漏排查
    给出 jmap + MAT 分析 ThreadLocal 未移除导致 OOM 的完整诊断流程

答案

题目1:G1调优实战

# 16GB堆电商服务推荐配置:
-XX:+UseG1GC 
-XX:MaxGCPauseMillis=200   # 目标暂停时间
-XX:G1NewSizePercent=30    # 新生代最小占比
-XX:G1MaxNewSizePercent=50 # 新生代最大占比
-XX:InitiatingHeapOccupancyPercent=45 # 并发回收阈值

平衡效果

  • GC暂停 ≤ 200ms

  • 吞吐量 > 95%

题目2:ThreadLocal泄漏排查
诊断流程

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

  2. MAT分析:

    • 查找ThreadLocal$Entry对象

    • 查看GC Root路径→未移除的ThreadLocal引用

  3. 修复代码:

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

⚡ 五、Java并发

题目

  1. 线程池陷阱
    分析 ThreadPoolExecutor 配置 corePoolSize=10, maxPoolSize=100 时任务被拒绝执行的四种场景,给出饱和策略选型建议

  2. 锁优化
    解释 ReentrantReadWriteLock 锁降级的使用场景及代码实现,为何写锁降级读锁是安全的?

答案:

题目1:线程池陷阱
拒绝执行的四种场景

  1. 工作线程数 ≥ corePoolSize 且队列满

  2. 工作线程数 ≥ maxPoolSize

  3. 线程池处于SHUTDOWN状态

  4. 任务抛出RejectedExecutionException

饱和策略选型

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

题目2:锁降级实现

ReentrantReadWriteLock rwl = new ReentrantReadWriteLock();
rwl.writeLock().lock();  // 获取写锁
try {// 写操作...rwl.readLock().lock(); // 降级开始(在写锁内获取读锁)
} finally {rwl.writeLock().unlock(); // 降级完成(写锁释放,仍持有读锁)
}try {// 读操作(仍受读锁保护)
} finally {rwl.readLock().unlock();
}

安全性:写锁释放前获取读锁,可防止其他写操作干扰


🌱 六、Spring框架(Spring Boot 3.x)

题目

  1. 事务传播机制
    当 @Transactional(propagation = Propagation.REQUIRES_NEW) 嵌套调用时,如何通过 TransactionSynchronizationManager 避免死锁?

  2. 安全配置
    设计 Spring Security 的权限缓存方案:如何用 RedisCacheManager 实现 UserDetailsService 的权限信息10分钟刷新?

  3. 云原生监控
    集成 Micrometer + Prometheus:如何通过 @Timed 统计Controller方法的P99响应时间?

答案:

题目1:事务传播防死锁
答案

@Transactional(propagation = Propagation.REQUIRES_NEW)
public void updateOrder(Order order) {// 检查事务状态if (TransactionSynchronizationManager.isActualTransactionActive()) {// 提交当前事务避免死锁TransactionAspectSupport.currentTransactionStatus().flush();}// 业务逻辑
}

题目2:权限缓存方案

@Bean
public UserDetailsService userDetailsService() {return username -> {String cacheKey = "userDetails::" + username;return redisTemplate.opsForValue().get(cacheKey, () -> dbUserDetailsService.loadUserByUsername(username), 10, TimeUnit.MINUTES // 缓存10分钟);};
}

题目3:P99监控配置

@Configuration
public class MetricsConfig {@Beanpublic TimedAspect timedAspect(MeterRegistry registry) {return new TimedAspect(registry);}
}@RestController
public class OrderController {@Timed(value = "order.query", percentiles = {0.5, 0.95, 0.99} // 统计P50/P95/P99)@GetMapping("/orders")public List<Order> query() { ... }
}

PromQL检测慢查询
histogram_quantile(0.99, sum(rate(order_query_seconds_bucket[5m])) by (le)) > 1


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

题目

  1. 限流容错设计
    针对 OpenAI API 的 429 错误,如何通过 Resilience4j 的 RateLimiter + Retry 实现指数退避重试?

  2. 向量检索落地
    如何用 Spring Data JPA + pgvector 扩展实现商品语义搜索?给出 @Query 调用 <=> 余弦相似度算子的示例

  3. 提示工程安全
    在 @Service 层设计提示词过滤:如何通过 OWASP ESAPI 防御大模型注入攻击?

答案

题目1:限流容错设计

RateLimiter rateLimiter = RateLimiter.of("openai", RateLimiterConfig.custom().limitRefreshPeriod(Duration.ofSeconds(10)).limitForPeriod(5) // 10秒5次.timeoutDuration(Duration.ZERO) // 立即失败.build());Retry retry = Retry.of("openai", RetryConfig.custom().maxAttempts(3).intervalFunction(IntervalFunction.ofExponentialBackoff(500, 2)) // 指数退避.retryOnException(e -> ((OpenAIException)e).getCode() == 429).build());Supplier<Completion> supplier = () -> openAIService.complete(prompt);
Completion result = Decorators.ofSupplier(supplier).withRetry(retry).withRateLimiter(rateLimiter).get();

题目2:向量检索实现

public interface ProductRepository extends JpaRepository<Product, Long> {@Query(value = "SELECT * FROM products ORDER BY embedding <=> :embedding LIMIT 10", nativeQuery = true)List<Product> findSimilarProducts(@Param("embedding") float[] embedding);
}// 调用
float[] queryEmbedding = model.encode("防水运动鞋");
productRepository.findSimilarProducts(queryEmbedding);

题目3:提示词过滤

@Service
public class PromptService {private static final Encoder esapiEncoder = ESAPI.encoder();public String sanitizePrompt(String input) {// 1. 过滤HTML/JSString safe = esapiEncoder.encodeForJavaScript(esapiEncoder.encodeForHTML(input));// 2. 移除敏感命令return safe.replaceAll("(?i)(delete|drop|system)", "");}
}

📌 今日知识地图

模块核心考点
Java基础Stream线程安全
MySQL索引优化+高并发事务
Redis/Kafka会话管理+消费语义
JVMG1调优+内存泄漏排查
并发线程池+读写锁降级
Spring微服务事务传播+安全缓存+监控埋点
大模型限流设计+向量检索+安全防护
http://www.dtcms.com/a/331476.html

相关文章:

  • 智慧养老解决方案:破解“最后一公里”服务难题
  • 【98页PPT】智慧方案某著名企业汽配行业ERP整体解决方案(附下载方式)
  • BGP笔记及实验
  • 网络层协议——IP
  • 2025年机器视觉与信号处理国际会议(MVSP 2025)
  • 72小时到24小时:台风“杨柳”过后,有鹿机器人如何为园区按下“加速键”?
  • SpringBoot 实现在线查看内存对象拓扑图 —— 给 JVM 装上“透视眼”
  • 面试题之项目中灰度发布是怎么做的
  • 16 ABP Framework CLI
  • Steam修改游戏安装目录
  • 通过beeware制作安卓apk用于获取cpolar网址
  • 【从零开始学习Redis】项目实战-黑马点评D1
  • Docker network网络管理入门教程
  • OpenCV 在图像上绘制二维图形的类cv::plot::Plot2d
  • 心灵笔记:沟通与协作
  • 搭建纯积分商城的关键注意事项
  • MySQL中的DML(二)
  • Spring基础面试题(三)
  • rtthread - ROMFS 的使用方式
  • 【自动驾驶】自动驾驶概述 ① ( 自动驾驶 与 无人驾驶 | 自动驾驶 相关岗位 及 技能需求 )
  • 网络安全应急响应
  • Java Stream API:让业务数据处理更优雅
  • 【120页PPT】人工智能与数字化转型的业财融合(附下载方式)
  • TDengine IDMP 基本功能(6. 无问智推)
  • Web攻防-业务逻辑篇APP隐私合规资源处理违规收集拒绝服务在线检测项目工具
  • 深度剖析!体育数据 API 及电竞数据 API 在体育电竞领域的核心地位
  • java动态代理机制I(初稿)
  • 职得AI简历-免费AI简历生成工具
  • C++ 排序指南
  • 7、C 语言数组进阶知识点总结