用 JDK 17 真實(shí)生成可被 MAT 打開(kāi)的堆快照練習(xí)文件
本文檔手把手教你用 JDK 17 生成真實(shí)的、MAT 可分析的堆快照文件.hprof并在 MAT 中完成一次完整的內(nèi)存泄漏分析練習(xí)。目錄一、前置準(zhǔn)備二、編寫(xiě)模擬內(nèi)存泄漏的 Java 程序三、編譯并運(yùn)行四、生成堆快照三種方式五、用 MAT 打開(kāi)并分析六、MAT 練習(xí)路線圖七、常見(jiàn)問(wèn)題排查八、一鍵腳本一、前置準(zhǔn)備1.1 確認(rèn) JDK 版本java-version預(yù)期輸出JDK 17 即可21 也行openjdk version 17.0.12 2024-07-16 OpenJDK Runtime Environment (build 17.0.127) OpenJDK 64-Bit Server VM (build 17.0.127, mixed mode)?? 不需要 JDK 17 特別版任何 JDK 11 都可以關(guān)鍵是有jmap和jcmd工具。1.2 下載 MAT參照之前的文檔下載與你 JDK 匹配的 MAT 版本JDK 版本推薦 MAT 版本下載地址JDK 17MAT 1.14.0https://download.eclipse.org/mat/1.14.0/rcp/JDK 21MAT 1.15.0 / 1.16.0https://www.eclipse.org/mat/downloads.php1.3 創(chuàng)建項(xiàng)目目錄mkdir-p~/mat-practicecd~/mat-practice二、編寫(xiě)模擬內(nèi)存泄漏的 Java 程序2.1 完整源碼在項(xiàng)目目錄中創(chuàng)建LeakDemo.javaimportjava.util.*;importjava.util.concurrent.*;/** * 模擬內(nèi)存泄漏的練習(xí)程序 * * 包含三種經(jīng)典泄漏場(chǎng)景 * 1. 靜態(tài)緩存 Map 無(wú)淘汰機(jī)制最常見(jiàn) * 2. ThreadLocal 未清理 * 3. 大對(duì)象byte[]持續(xù)分配 * * 運(yùn)行方式 * javac LeakDemo.java * java -Xms512m -Xmx512m -XX:HeapDumpOnOutOfMemoryError \ * -XX:HeapDumpPath./leak.hprof LeakDemo */publicclassLeakDemo{// 場(chǎng)景1靜態(tài)緩存泄漏 // Spring 單例 Bean 中的 static Map只 put 不 removeprivatestaticfinalMapLong,byte[]productCachenewConcurrentHashMap();// 場(chǎng)景2ThreadLocal 泄漏 // 每個(gè)線程持有一個(gè)不斷增長(zhǎng)的 List線程不退出 → 內(nèi)存泄漏privatestaticfinalThreadLocalListStringthreadLocalDataThreadLocal.withInitial(ArrayList::new);// 場(chǎng)景3大對(duì)象列表 // ArrayList 不斷 add 1MB 的 byte[]永不清理privatestaticfinalListbyte[]tempBuffersnewArrayList();// 控制程序運(yùn)行privatestaticvolatilebooleanrunningtrue;publicstaticvoidmain(String[]args)throwsException{longpidProcessHandle.current().pid();System.out.println();System.out.println( LeakDemo - 內(nèi)存泄漏模擬程序);System.out.println( PID: pid);System.out.println();System.out.println();System.out.println(手動(dòng)生成堆快照命令);System.out.println( jmap -dump:formatb,fileleak.hprof pid);System.out.println( 或);System.out.println( jcmd pid GC.heap_dump leak.hprof);System.out.println();System.out.println(等待 OOM 自動(dòng) dump或手動(dòng)執(zhí)行上面的命令...);System.out.println();// 啟動(dòng)監(jiān)控線程startMonitor();longcounter0;while(running){// --- 場(chǎng)景1緩存泄漏 ---// 每個(gè)對(duì)象 1MB不停塞入 MapproductCache.put(counter,newbyte[1024*1024]);// --- 場(chǎng)景2ThreadLocal 泄漏 ---// 每個(gè)線程的 List 不斷增長(zhǎng)threadLocalData.get().add(leak-data-counter);// --- 場(chǎng)景3臨時(shí)緩沖區(qū)雖然叫臨時(shí)但永不清理---if(counter%100){tempBuffers.add(newbyte[1024*1024]);// 每10次加一個(gè)1MB}counter;// 打印進(jìn)度if(counter%500){System.out.printf([%6d] cache%d, threadLocal%d, buffers%d%n,counter,productCache.size(),threadLocalData.get().size(),tempBuffers.size());}// 控制速度避免瞬間 OOM讓你有時(shí)間手動(dòng) dumpTimeUnit.MILLISECONDS.sleep(50);}}/** * 監(jiān)控線程每 5 秒打印堆內(nèi)存使用情況 */privatestaticvoidstartMonitor(){ThreadtnewThread(()-{RuntimertRuntime.getRuntime();while(running){longused(rt.totalMemory()-rt.freeMemory())/1024/1024;longmaxrt.maxMemory()/1024/1024;doublepct(double)used/max*100;System.out.printf([Monitor] 堆: %dMB/%dMB (%.0f%%)%s%n,used,max,pct,pct85? ?? 即將OOM!:);try{Thread.sleep(5000);}catch(InterruptedExceptionignored){}}},monitor);t.setDaemon(true);t.start();}}2.2 代碼說(shuō)明場(chǎng)景代碼位置模擬的真實(shí)問(wèn)題靜態(tài)緩存泄漏productCache電商商品緩存無(wú)淘汰Map 無(wú)限增長(zhǎng)ThreadLocal 泄漏threadLocalDataWeb 容器線程池中的 ThreadLocal 未 remove大對(duì)象堆積tempBuffers集合只 add 不 clearbyte[] 占滿堆三、編譯并運(yùn)行3.1 編譯cd~/mat-practice javac LeakDemo.java編譯成功后會(huì)生成LeakDemo.class文件。3.2 運(yùn)行帶 OOM 自動(dòng) dump 參數(shù)java-Xms512m-Xmx512m\-XX:HeapDumpOnOutOfMemoryError\-XX:HeapDumpPath./leak.hprof\LeakDemo或者在pom.xml文件添加配置buildpluginsplugingroupIdorg.springframework.boot/groupIdartifactIdspring-boot-maven-plugin/artifactIdconfigurationjvmArguments-Xms256m-Xmx256m-XX:MetaspaceSize128m-XX:MaxMetaspaceSize256m-XX:UseG1GC-XX:HeapDumpOnOutOfMemoryError-XX:HeapDumpPath./heapdump.hprof-Dfile.encodingUTF-8/jvmArguments/configuration/plugin/plugins/build參數(shù)解釋參數(shù)作用-Xms512m初始堆大小 512MB-Xmx512m最大堆大小 512MB故意設(shè)小快速觸發(fā) OOM-XX:HeapDumpOnOutOfMemoryErrorOOM 時(shí)自動(dòng)生成堆快照-XX:HeapDumpPath./leak.hprof快照保存路徑3.3 預(yù)期運(yùn)行效果 LeakDemo - 內(nèi)存泄漏模擬程序 PID: 12345 手動(dòng)生成堆快照命令 jmap -dump:formatb,fileleak.hprof 12345 或 jcmd 12345 GC.heap_dump leak.hprof 等待 OOM 自動(dòng) dump或手動(dòng)執(zhí)行上面的命令... [Monitor] 堆: 45MB/512MB (8%) [ 50] cache50, threadLocal50, buffers5 [ 100] cache100, threadLocal100, buffers10 [Monitor] 堆: 158MB/512MB (30%) [ 150] cache150, threadLocal150, buffers15 ... [Monitor] 堆: 450MB/512MB (87%) ?? 即將OOM! [ 480] cache480, threadLocal480, buffers48 [Monitor] 堆: 495MB/512MB (96%) [Monitor] 堆: 508MB/512MB (99%) ?? 即將OOM! java.lang.OutOfMemoryError: Java heap space Dumping heap to ./leak.hprof ... Heap dump file created [268435456 bytes in 2.345 secs]leak.hprof文件已自動(dòng)生成這就是一個(gè)真實(shí)的、MAT 可分析的堆快照。四、生成堆快照三種方式方式一OOM 自動(dòng)生成最簡(jiǎn)單就是上面 3.2 的方式等程序自然 OOM 即可。適合練習(xí)和演示。方式二jmap 手動(dòng)生成最常用 ?程序運(yùn)行時(shí)另開(kāi)一個(gè)cmd終端執(zhí)行# 1. 查找 PIDjps-l# 輸出示例12345 LeakDemo# 2. 生成堆快照jmap-dump:formatb,fileleak.hprofPID# 輸出Heap dump file created??關(guān)鍵參數(shù)說(shuō)明formatb→ 生成二進(jìn)制格式MAT 可識(shí)別不要加live參數(shù)jmap -dump:live,...會(huì)先觸發(fā) Full GC把所有泄漏對(duì)象清掉MAT 就分析不出問(wèn)題了方式三jcmd 生成JDK 7 推薦# 查找 PIDjcmd# 生成堆快照jcmd12345GC.heap_dump leak.hprofjcmd是 Oracle 官方推薦的替代jmap的新工具功能更全。三種方式對(duì)比方式觸發(fā)條件優(yōu)點(diǎn)缺點(diǎn)OOM 自動(dòng)堆滿了零操作自動(dòng)生成服務(wù)已崩潰jmap隨時(shí)手動(dòng)靈活不影響服務(wù)會(huì)觸發(fā) STW短暫停頓jcmd隨時(shí)手動(dòng)官方推薦功能多同 jmap五、用 MAT 打開(kāi)并分析5.1 打開(kāi)堆快照啟動(dòng) MATFile→Open Heap Dump→ 選擇leak.hprof選擇Leak Suspects Report點(diǎn)擊Finish5.2 預(yù)期看到的分析結(jié)果MAT 會(huì)自動(dòng)生成報(bào)告你應(yīng)該能看到類(lèi)似以下內(nèi)容Leak Suspects Report:Dominator Tree支配樹(shù)Window→Open Dominator Tree按Retained Heap排序你會(huì)看到Path To GC Roots關(guān)鍵操作在 Dominator Tree 中右鍵ConcurrentHashMap選擇Path To GC Roots→exclude weak/soft references你會(huì)看到引用鏈③ Histogram直方圖Window→Histogram按Objects排序Class Name | Objects | Shallow Heap ----------------------------|---------|------------- byte[] | 528 | 480 MB ← 異常多的 byte[] java.lang.String | 480 | 38 MB java.util.concurrent.ConcurrentHashMap$Node | 480 | 30 MB④ Thread OverviewWindow→Thread Overview查看每個(gè)線程的內(nèi)存占用找到持有大量 ThreadLocal 數(shù)據(jù)的線程。六、MAT 練習(xí)路線圖打開(kāi)堆快照后按以下順序練習(xí)由淺入深第 1 步看自動(dòng)報(bào)告Leak Suspects標(biāo)簽頁(yè)看 Problem Suspect 摘要點(diǎn)擊Details查看詳情理解 MAT 的自動(dòng)分析邏輯第 2 步Histogram 分析Window→Histogram按對(duì)象數(shù)量排序 → 找異常多的類(lèi)按 Shallow Heap 排序 → 找大對(duì)象右鍵類(lèi) →List objects→with incoming references第 3 步Dominator TreeWindow→Open Dominator Tree按 Retained Heap 排序找到占用內(nèi)存最大的對(duì)象理解 Shallow vs Retained 的區(qū)別第 4 步GC Roots 引用鏈核心技能右鍵對(duì)象 →Path To GC Roots→exclude weak references看清誰(shuí)在引用這個(gè)對(duì)象理解為什么 GC 無(wú)法回收定位到具體的代碼變量名第 5 步OQL 查詢Window→OQL-- 查找所有 byte[] 且大小超過(guò) 1MB 的SELECT*FROMbyte[]WHERElength1048576-- 查找 String 對(duì)象SELECT*FROMjava.lang.String-- 查找 ArrayList 實(shí)例SELECT*FROMjava.util.ArrayListWHERElength100第 6 步對(duì)比兩次快照進(jìn)階程序運(yùn)行 30 秒時(shí) dump 一次 →dump1.hprof程序運(yùn)行 60 秒時(shí) dump 一次 →dump2.hprofMAT 中打開(kāi)dump2.hprof→Compare Basket→Add再打開(kāi)dump1.hprof→Compare Basket→Add點(diǎn)擊Compare→ 查看對(duì)象增長(zhǎng)趨勢(shì)七、常見(jiàn)問(wèn)題排查7.1 MAT 打開(kāi)報(bào)錯(cuò) “Unknown HPROF Version”原因文件不是標(biāo)準(zhǔn) HPROF 格式可能是文本文件或偽造的。排查# 檢查文件頭前 4 個(gè)字節(jié)應(yīng)該是 JAVAxxd leak.hprof|head-1# 正確輸出00000000: 4a41 5641 2050 524f 4649 4c45 2031 2e30# (JAVA PROFILE 1.0)# 檢查文件大小ls-lhleak.hprof# 應(yīng)該 100MB512MB 堆大概產(chǎn)生 200~400MB 的 hprof解決用jmap -dump:formatb,...或jcmd GC.heap_dump重新生成。7.2 MAT 顯示 “No leak suspect was found”原因生成快照時(shí)加了live參數(shù)觸發(fā)了 Full GC泄漏對(duì)象被清掉了。錯(cuò)誤命令jmap -dump:live,formatb,fileleak.hprofpid?正確命令jmap-dump:formatb,fileleak.hprofpid?7.3 MAT 打開(kāi)時(shí)報(bào) OOM原因MAT 自身內(nèi)存不足無(wú)法解析大文件。解決編輯MemoryAnalyzer.ini-vmargs -Xms2g -Xmx4g ← 調(diào)大這個(gè)建議設(shè)為 hprof 文件大小的 1.5~2 倍 -XX:UseG1GC7.4 生成的 hprof 文件太小只有幾 MB原因程序還沒(méi)來(lái)得及分配大量對(duì)象就退出了或者堆設(shè)太大、還沒(méi)填滿。解決減小堆-Xms256m -Xmx256m更快 OOM加快速度去掉Thread.sleep(50)確保程序真的在運(yùn)行看控制臺(tái)輸出7.5 jmap 執(zhí)行卡住或報(bào) “Unable to attach”原因PID 不對(duì)或權(quán)限不足或容器環(huán)境限制。排查# 確認(rèn) PIDjps-l# 確認(rèn)是同一個(gè)用戶ps-ppid-ouser,pid,cmd# 容器環(huán)境用 jcmdjcmdpidGC.heap_dump leak.hprof八、一鍵腳本8.1 Linux/Mac 一鍵腳本run.sh#!/bin/bashset-eechoecho MAT 堆快照練習(xí) - 一鍵運(yùn)行echoecho# 編譯echo[1/3] 編譯...javac LeakDemo.javaecho? 編譯成功echo# 創(chuàng)建輸出目錄mkdir-pdumps# 運(yùn)行后臺(tái)echo[2/3] 啟動(dòng) LeakDemo后臺(tái)運(yùn)行...java\-Xms512m-Xmx512m\-XX:HeapDumpOnOutOfMemoryError\-XX:HeapDumpPath./dumps/leak_auto.hprof\-XX:PrintGCDetails\-Xloggc:./dumps/gc.log\LeakDemoPID$!echo? 進(jìn)程已啟動(dòng)PID$PIDecho# 等待 30 秒讓程序分配一些內(nèi)存echo[3/3] 等待 30 秒后手動(dòng)生成堆快照...sleep30# 手動(dòng) dump不帶 live保留泄漏對(duì)象echo 正在生成堆快照...jmap-dump:formatb,file./dumps/leak_manual.hprof$PIDecho? 堆快照已保存到 ./dumps/leak_manual.hprofecho# 打印文件信息echo 生成的文件ls-lhdumps/echoecho 用 MAT 打開(kāi) ./dumps/leak_manual.hprof 開(kāi)始練習(xí)echo# 等待用戶按回車(chē)后殺掉進(jìn)程read-p按回車(chē)鍵停止 LeakDemo...kill$PID2/dev/nullecho? 進(jìn)程已停止8.2 Windows 一鍵腳本run.batecho off echo echo MAT 堆快照練習(xí) - 一鍵運(yùn)行 echo echo. echo [1/3] 編譯... javac LeakDemo.java if errorlevel 1 ( echo ? 編譯失敗請(qǐng)檢查 JDK 是否安裝 pause exit /b 1 ) echo ? 編譯成功 echo. mkdir dumps 2nul echo [2/3] 啟動(dòng) LeakDemo后臺(tái)運(yùn)行... start /b java -Xms512m -Xmx512m -XX:HeapDumpOnOutOfMemoryError -XX:HeapDumpPath./dumps/leak_auto.hprof LeakDemo echo ? 進(jìn)程已啟動(dòng) echo. echo [3/3] 等待 30 秒... timeout /t 30 /nobreak nul echo 查找 PID 并生成堆快照... for /f tokens1 %%i in (jps -l ^| findstr LeakDemo) do ( echo PID: %%i jmap -dump:formatb,file./dumps/leak_manual.hprof %%i ) echo ? 堆快照已保存到 .\dumps\leak_manual.hprof echo. echo 生成的文件 dir dumps echo. echo 用 MAT 打開(kāi) .\dumps\leak_manual.hprof 開(kāi)始練習(xí) echo. pause九、總結(jié)核心要點(diǎn)堆快照必須從真實(shí)運(yùn)行的 JVM 中導(dǎo)出用jmap/jcmd/-XX:HeapDumpOnOutOfMemoryError不要加live參數(shù)否則 Full GC 會(huì)把泄漏對(duì)象清掉formatb必須有確保是二進(jìn)制格式MAT 的-Xmx要夠大建議設(shè)為 hprof 文件大小的 1.5~2 倍分析三板斧Histogram → Dominator Tree → Path To GC Roots完整命令速查# 編譯javac LeakDemo.java# 運(yùn)行OOM 自動(dòng) dumpjava-Xms512m-Xmx512m\-XX:HeapDumpOnOutOfMemoryError\-XX:HeapDumpPath./leak.hprof\LeakDemo# 查找 PIDjps-l# 手動(dòng) dump推薦jmap-dump:formatb,fileleak.hprofpid# 或 jcmdjcmdpidGC.heap_dump leak.hprof# 驗(yàn)證文件格式xxd leak.hprof|head-1# 應(yīng)看到4a41 5641 2050 524f 4649 4c45JAVA PROFILE練習(xí)建議先用小堆-Xmx256m快速觸發(fā) OOM 自動(dòng)生成快照再用jmap手動(dòng)在不同時(shí)機(jī)生成多份快照做對(duì)比分析。掌握這套流程后線上遇到真實(shí) OOM 你就能從容應(yīng)對(duì)。附錄JVM 參數(shù)速查表參數(shù)作用推薦值-Xms初始堆大小與-Xmx一致-Xmx最大堆大小根據(jù)物理內(nèi)存設(shè)置-XX:HeapDumpOnOutOfMemoryErrorOOM 時(shí)自動(dòng) dump所有環(huán)境必開(kāi)-XX:HeapDumpPathdump 文件路徑確保目錄存在且有寫(xiě)權(quán)限-XX:PrintGCDetails打印 GC 詳情排查必備-XloggcGC 日志路徑/data/logs/gc.log-XX:DisableExplicitGC禁止 System.gc()生產(chǎn)環(huán)境建議開(kāi)啟-XX:MaxDirectMemorySize限制堆外內(nèi)存根據(jù) NIO 使用量設(shè)置

相關(guān)新聞

電商商家獲客難獲客貴解決方案:平臺(tái)賣(mài)家如何借助 BBWEYY 打造第二獲客入口,含零代碼SAAS、AI編程、源碼定制交付

電商商家獲客難獲客貴解決方案:平臺(tái)賣(mài)家如何借助 BBWEYY 打造第二獲客入口,含零代碼SAAS、AI編程、源碼定制交付

平臺(tái)賣(mài)家如何借助 BBWEYY 打造第二獲客入口 摘要 在平臺(tái)流量競(jìng)爭(zhēng)持續(xù)升級(jí)、廣告成本不斷上升的背景下,越來(lái)越多電商平臺(tái)商家面臨站內(nèi)獲客貴、站外獲客弱、客戶沉淀難的現(xiàn)實(shí)問(wèn)題。本文圍繞電商平臺(tái)商家的增長(zhǎng)困境展開(kāi),重點(diǎn)討論 BBWEYY 小程序與 GEO 服務(wù)…

2026/7/29 15:17:17 閱讀更多
Arduino 101開(kāi)發(fā)環(huán)境搭建指南:從驅(qū)動(dòng)安裝到第一個(gè)Blink程序

Arduino 101開(kāi)發(fā)環(huán)境搭建指南:從驅(qū)動(dòng)安裝到第一個(gè)Blink程序

1. 從零開(kāi)始:為什么選擇 Arduino/Genuino 101 作為起點(diǎn)? 如果你剛剛踏入嵌入式開(kāi)發(fā)或者物聯(lián)網(wǎng)硬件的大門(mén),面對(duì)琳瑯滿目的開(kāi)發(fā)板,可能會(huì)感到一絲迷茫。Arduino Uno、ESP8266、樹(shù)莓派 Pico…… 每個(gè)都宣稱(chēng)自己簡(jiǎn)單易用。那么&#x…

2026/7/29 15:17:17 閱讀更多
三只貓課后作業(yè)3

三只貓課后作業(yè)3

說(shuō)明 下面的思考以及答案,都是本人憑經(jīng)驗(yàn)輸出的,對(duì)于 AI,我的經(jīng)驗(yàn)很不足的,主要是起到一個(gè)記錄作用,以后熟悉這塊之后再回過(guò)頭來(lái)看看自己的來(lái)時(shí)路。 作者有一句話,值得在平時(shí)工作中使用:要思考a…

2026/7/29 15:17:17 閱讀更多
IDM激活腳本:3步永久解鎖下載神器的終極方案

IDM激活腳本:3步永久解鎖下載神器的終極方案

IDM激活腳本:3步永久解鎖下載神器的終極方案 【免費(fèi)下載鏈接】IDM-Activation-Script IDM Activation & Trail Reset Script 項(xiàng)目地址: https://gitcode.com/gh_mirrors/id/IDM-Activation-Script 還在為Internet Download Manager的30天試用期煩惱嗎&am…

2026/7/29 16:07:23 閱讀更多
2017臺(tái)灣計(jì)算機(jī)展創(chuàng)客市集深度觀察:從開(kāi)源硬件到完整方案的演進(jìn)

2017臺(tái)灣計(jì)算機(jī)展創(chuàng)客市集深度觀察:從開(kāi)源硬件到完整方案的演進(jìn)

1. 項(xiàng)目概述:一場(chǎng)屬于創(chuàng)客的春日盛宴 每年春季,對(duì)于海峽對(duì)岸的科技愛(ài)好者和硬件開(kāi)發(fā)者而言,臺(tái)灣計(jì)算機(jī)展(COMPUTEX TAIPEI)的創(chuàng)客市集(Maker Faire)都是一個(gè)不容錯(cuò)過(guò)的盛會(huì)。2017年的春季展&…

2026/7/29 16:07:23 閱讀更多
免費(fèi)閱讀APP書(shū)源終極配置指南:3分鐘打造個(gè)人專(zhuān)屬小說(shuō)圖書(shū)館

免費(fèi)閱讀APP書(shū)源終極配置指南:3分鐘打造個(gè)人專(zhuān)屬小說(shuō)圖書(shū)館

免費(fèi)閱讀APP書(shū)源終極配置指南:3分鐘打造個(gè)人專(zhuān)屬小說(shuō)圖書(shū)館 【免費(fèi)下載鏈接】Yuedu 📚「閱讀」自用書(shū)源分享 項(xiàng)目地址: https://gitcode.com/gh_mirrors/yu/Yuedu 還在為找不到好看的小說(shuō)而煩惱?想要在閱讀APP中暢享海量免費(fèi)小說(shuō)資源&…

2026/7/29 16:07:23 閱讀更多
還在手動(dòng)配 Python 環(huán)境?Hermes 預(yù)打包安裝方案快速搭建本地 Agent

還在手動(dòng)配 Python 環(huán)境?Hermes 預(yù)打包安裝方案快速搭建本地 Agent

🔍前言 許多嘗試在本地部署 AI 智能體的用戶,常常被 Hermes 原生部署的復(fù)雜配置流程所困擾。傳統(tǒng)的源碼搭建方式需要手動(dòng)匹配特定版本的 Python 和 Node.js,批量安裝大量第三方依賴(lài),并逐一調(diào)試系統(tǒng)環(huán)境變量、解決端口占用、修復(fù)路…

2026/7/29 15:57:23 閱讀更多
面試官大笑:“一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,不比 1 個(gè)快 5 倍?“我搖頭:“快不了,還可能更慢“

面試官大笑:“一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,不比 1 個(gè)快 5 倍?“我搖頭:“快不了,還可能更慢“

前兩個(gè)月,我在重構(gòu) AlgoMooc 網(wǎng)站過(guò)程中,發(fā)現(xiàn)一個(gè)問(wèn)題:在 Claude Code 里把一個(gè)任務(wù)拆給 5 個(gè) Subagent 并行跑,結(jié)果可能比 1 個(gè) agent 從頭干到尾還慢? 大多數(shù)人的第一反應(yīng)是反過(guò)來(lái)的:活是并行干的&#…

2026/7/29 0:15:24 閱讀更多
# 鴻蒙 HarmonyOS 應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號(hào)與動(dòng)畫(huà)渲染精講

# 鴻蒙 HarmonyOS 應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)(第25期)|骰子(Dice Roller)— Unicode 符號(hào)與動(dòng)畫(huà)渲染精講

一、應(yīng)用概述 骰子(Dice Roller) 是一款經(jīng)典的休閑娛樂(lè)應(yīng)用,模擬了真實(shí)擲骰子的過(guò)程。應(yīng)用投擲兩個(gè)骰子(六面標(biāo)準(zhǔn)骰),使用 Unicode 骰面符號(hào)直觀展示每個(gè)骰子的點(diǎn)數(shù),并伴有快速滾動(dòng)的動(dòng)畫(huà)效果。…

2026/7/29 0:15:24 閱讀更多