| 環境 | 啟動內存 | 運行趨勢 | 結果 |
|---|---|---|---|
| Windows (本地) | 幾十 MB | 心跳/任務後下降,隨後回升 | 健康 |
| Linux (生產) | 200+ MB | 持續上升,不回落,最終 OOM | 崩潰 |
# 1. 查看進程內存分佈
jcmd VM.native_memory summary
# 2. 堆內存快照
jmap -dump:live,format=b,file=heap.hprof
# 用 MAT/Eclipse Memory Analyzer 分析
# 3. 線程快照
jstack > threads.txt
# 關注 RUNNABLE 狀態的 Netty IO 線程、定時任務線程
# 4. GC 日志(啟動參數加上)
-XX:+PrintGCDetails -XX:+PrintGCDateStamps -Xloggc:gc.log
// 必須在 handler 最後釋放
@Override
public void channelRead(ChannelHandlerContext ctx, Object msg) {
ByteBuf buf = (ByteBuf) msg;
try {
// 處理業務
} finally {
ReferenceCountUtil.release(buf); // 關鍵!
}
}
@PreDestroy
public void shutdown() {
scheduledExecutorService.shutdownNow(); // 春容器關閉時調用
}
-server -d64
-Xms2g -Xmx2g
-XX:MaxDirectMemorySize=1g
-XX:+UseG1GC -XX:MaxGCPauseMillis=200
-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/logs/heap.hprof
-Xss512k
Windows/Linux 內存表現不一致,90% 是堆外內存(Direct Buffer / 線程棧 / JNI)未受堆限制導致。優先檢查 Netty 洩漏、線程池配置、JVM 參數是否顯式限制 Off-Heap。