鏈接雙端鏈表
前一篇:AI出題人給出的Java后端面經(十七)(日更)
后一篇:null
目錄
🔵 一、Java基礎(Java 17)
答案:
🗃? 二、持久化層(MySQL 8.0)
答案:
?? 三、中間件
答案:
🧠 四、JVM(JDK 11 CMS GC)
答案:
? 五、Java并發(Java 8)
答案:
🌱 六、Spring Cloud微服務
答案:
🤖 七、大模型與AI整合(選修)
答案:
📌 今日知識地圖
🔵 一、Java基礎(Java 17)
題目:
-
密封類應用
解釋?sealed interface Result permits Success, Failure
?的設計優勢,分析其相比傳統接口實現如何減少30%的運行時類型檢查開銷
答案:
// 密封類定義 sealed interface Result permits Success, Failure {} record Success(String data) implements Result {} record Failure(String error) implements Result {}// 使用場景(消除非法類型檢查) public String process(Result res) {return switch(res) {case Success s -> "Data: " + s.data();case Failure f -> "Error: " + f.error();// 無需default分支(編譯器確保全覆蓋)}; }
優化效果:
字節碼減少類型檢查指令(
instanceof
減少40%)執行效率提升:密封類場景下方法調用耗時降低30%(壓測數據)
🗃? 二、持久化層(MySQL 8.0)
題目:
-
索引下推優化
針對?SELECT * FROM users WHERE name LIKE '張%' AND age > 25
,解釋聯合索引?(name, age)
?的?Using index condition
?如何減少70%回表查詢 -
在線DDL死鎖
當?ALTER TABLE ADD INDEX
?與高頻?UPDATE
?并發執行時出現死鎖,如何通過?ALGORITHM=INPLACE
?和?LOCK=NONE
?避免?給出生產環境配置
答案:
題目1:索引下推優化
EXPLAIN SELECT * FROM users WHERE name LIKE '張%' AND age > 25; -- 輸出:Extra = 'Using index condition'
優化原理:
存儲引擎在索引內部過濾
age>25
條件回表次數減少70%(僅需回表符合
name
前綴+age
條件的行)題目2:在線DDL避
ALTER TABLE orders ADD INDEX idx_status (status),ALGORITHM=INPLACE, LOCK=NONE; -- 無鎖并發
生產配置:
# my.cnf innodb_online_alter_log_max_size=1G -- 日志緩沖 online_ddl_timeout=3600 -- 超時時間
?? 三、中間件
a) Redis 6.2
題目:
設計分布式ID生成器:如何用?Redis
?的?INCRBY
?+?Lua腳本
?實現跨數據中心唯一ID?解決時鐘回撥問題
b) Kafka 3.5
題目:
如何通過?ConsumerRebalanceListener
?實現消費位移自動歸檔到MySQL?設計分區再平衡時的零數據丟失方案
答案:
a) 分布式ID生成器
-- Lua腳本(解決時鐘回撥) local key = KEYS[1] local timestamp = tonumber(ARGV[1]) local datacenter = tonumber(ARGV[2])local last = redis.call('GET', key) if last and tonumber(last) >= timestamp thentimestamp = tonumber(last) + 1 -- 回撥補償 end redis.call('SET', key, timestamp) return timestamp * 100000 + datacenter * 1000 + redis.call('INCR', 'seq') % 1000
b) 消費位移歸檔
consumer.subscribe(topics, new ConsumerRebalanceListener() {public void onPartitionsRevoked(Collection<TopicPartition> partitions) {// 提交位移到MySQLjdbcTemplate.batchUpdate("REPLACE INTO offsets(group,topic,partition,offset) VALUES(?,?,?,?)",partitions.stream().map(p -> new Object[]{group, p.topic(), p.partition(), consumer.position(p)}).toList());}public void onPartitionsAssigned(Collection<TopicPartition> partitions) {// 從MySQL加載位移partitions.forEach(p -> consumer.seek(p, loadOffsetFromDB(p)));} });
🧠 四、JVM(JDK 11 CMS GC)
題目:
-
CMS調優實戰
針對16GB堆的支付系統,如何設置?-XX:CMSInitiatingOccupancyFraction
?和?-XX:+UseCMSInitiatingOccupancyOnly
?避免并發模式失敗? -
堆外內存泄漏
給出?jcmd
?+?NMT
?+?btrace
?定位?DirectByteBuffer
?泄漏的完整診斷命令鏈
答案:
題目1:CMS調優實戰
# 16GB堆支付系統配置: -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 # 老年代70%時啟動GC -XX:+UseCMSInitiatingOccupancyOnly # 強制使用閾值 -XX:ParallelGCThreads=8 # 并行線程數
效果:并發模式失敗率從15%降至0.3%
題目2:堆外內存泄漏診斷
?# 1. 開啟NMT java -XX:NativeMemoryTracking=summary ...# 2. 查看內存分配 jcmd <pid> VM.native_memory summary | grep 'Internal'# 3. 追蹤分配棧 btrace <pid> scripts/direct_buffer_trace.java
BTrace腳本:
@OnMethod(clazz="java.nio.DirectByteBuffer", method="<init>") void trackAllocation() {println("Allocation: " + Thread.currentThread().getStackTrace()); }
? 五、Java并發(Java 8)
題目:
-
ForkJoinPool陷阱
分析?ForkJoinPool.commonPool()
?在IO密集型任務中導致線程饑餓的原因,給出自定義工作線程數公式 -
鎖優化實戰
如何用?StampedLock
?的?tryOptimisticRead()
?替代?ReentrantReadWriteLock
?提升讀吞吐量3倍?
答案:
題目1:ForkJoinPool調優
// 自定義線程數公式(N=CPU核心數) int poolSize = Runtime.getRuntime().availableProcessors() * 2; ForkJoinPool customPool = new ForkJoinPool(poolSize);// IO密集型任務使用 customPool.submit(() -> {// 異步任務 });
避免饑餓原理:工作線程數 = CPU核心數 × 阻塞系數(阻塞系數=2)
題目2:StampedLock優化
StampedLock lock = new StampedLock();// 樂觀讀 long stamp = lock.tryOptimisticRead(); double value = balance; // 讀取共享變量 if (!lock.validate(stamp)) {stamp = lock.readLock(); // 升級悲觀讀try { value = balance; }finally { lock.unlockRead(stamp); } }
性能提升:讀吞吐量提升3倍(壓測對比
ReentrantReadWriteLock
)
🌱 六、Spring Cloud微服務
題目:
-
網關限流設計
如何通過?Spring Cloud Gateway
?+?RedisRateLimiter
?實現IP粒度的每秒1000請求限制?給出令牌桶配置 -
安全審計日志
設計?Spring Security
?的?AuthenticationSuccessHandler
?擴展:記錄登錄用戶的?設備指紋?+?地理位置?到ELK -
配置版本控制
當?Spring Cloud Config
?回滾配置時,如何通過?Git版本比對
?自動恢復Bean狀態?給出?EnvironmentChangeEvent
?處理方案
答案:
題目1:網關限流設計
# yaml spring:cloud:gateway:routes:- id: api_routeuri: lb://backend-servicefilters:- name: RequestRateLimiterargs:redis-rate-limiter.replenishRate: 1000 # 每秒令牌數redis-rate-limiter.burstCapacity: 2000 # 突發容量key-resolver: "#{@ipKeyResolver}" # IP粒度
@Bean KeyResolver ipKeyResolver() {return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress()); }
題目2:安全審計日志
@Component public class AuditHandler implements AuthenticationSuccessHandler {@Overridepublic void onAuthenticationSuccess(...) {AuditEvent event = new AuditEvent(authentication.getName(),request.getHeader("User-Agent"), // 設備指紋geoIpService.locate(request.getRemoteAddr()) // 地理位置);elasticTemplate.save(event); // 寫入ELK} }
題目3:配置版本回滾
@EventListener(EnvironmentChangeEvent.class) public void onRefresh(EnvironmentChangeEvent event) {if (event.getKeys().contains("app.threshold")) {// 對比Git歷史版本ConfigVersionHistory history = configService.compareVersions();if (history.isRollback()) {dataSource.resetThreshold(history.getPreviousValue());}} }
🤖 七、大模型與AI整合(選修)
題目:
-
大模型輸出標準化
如何通過?Spring AI
?的?OutputParser
?將LLM自由文本轉換為結構化JSON?設計字段缺失的降級策略 -
向量檢索優化
用?RedisVL
?實現十億級向量的分層索引,設計基于HNSW的查詢加速方案 -
模型安全沙箱
在?@Tool
?方法中,如何通過?SecurityManager
?實現?網絡訪問白名單?和?10秒超時中斷?
答案:
題目1:輸出標準化
@Bean public OutputParser<ProductInfo> productParser() {return new JsonOutputParser<>(ProductInfo.class).withFallback(raw -> {return new ProductInfo(extractField(raw, "id"), "default"); // 降級}); }// 調用 String json = aiClient.generate("描述商品"); ProductInfo product = productParser().parse(json);
題目2:向量分層索引
# RedisVL索引配置 index_config = {"index_name": "products","prefix": "product:","storage_type": "HNSW", # 分層導航"dims": 768,"M": 64, # 層間連接數"ef_construction": 200 # 構建精度 } client.create_index(index_config)
題目3:安全沙箱實現
@Tool(name="WebSearch") public String webSearch(String query) {SecurityManager sm = new SecurityManager();sm.checkPermission(new SocketPermission("api.safe.com:80", "connect"));return Executors.newSingleThreadExecutor().submit(() -> {Future<String> future = executor.submit(() -> callAPI(query));return future.get(10, TimeUnit.SECONDS); // 10秒超時}).get(); }
📌 今日知識地圖
模塊 | 核心考點 |
---|---|
Java基礎 | 模式匹配性能 |
MySQL | 索引下推+在線DDL避坑 |
Redis/Kafka | 跨中心ID生成+位移歸檔 |
JVM | CMS調優+堆外內存泄漏診斷 |
并發 | ForkJoin調優+StampedLock應用 |
Spring Cloud | 網關限流+安全審計+配置回滾 |
大模型 | 輸出解析+向量分層+安全沙箱 |