GC 為開發帶來便利,但在高併發、低延遲場景下,**GC 停頓成為核心瓶頸**。當前算法(含 G1)仍無法完全消除停頓,這正是 G1 誕生的動力。
我們真的需要分配如此大的堆嗎?
能否通過「用好內存」而非「加大內存」來設計系統?
堆裡到底裝了什麼?
每次請求從外部存儲讀取,堆內存≈峰值併發處理所需內存。GC 壓力極小,但業務響應慢。
利用 mmap 或 DirectByteBuffer,將緩存放在**堆外內存**(或 tmpfs)。Java 應用以文件 API 訪問,實際命中內存。**兼得:應用邏輯簡單 + GC 無感知 + 大容量緩存**。
代表技術:**Memcached、Redis、Ehcache 堆外模式、MapDB、Chronicle Map**。
每個 JVM 堆控制在 GC 可接受範圍(如 2-4GB),單次停頓可控。代價:引入分布式系統複雜度(RPC、一致性、運維)。
期望 JVM 提供 API:標記對象「暫不回收」或「指定時間回收」,減少 GC 掃描開銷。類似 C/C++ 手動管理與 GC 結合,若實現將是質的飛躍。
Sun/Oracle HotSpot G1 成熟後,差距已大幅縮小,技術選型需綜合成本、生態、團隊熟悉度。