Java EE 應用性能受多層因素影響:應用代碼 → GlassFish 容器 → JVM → 作業系統 → 硬體 (CPU/記憶體/網卡/磁碟)。調優需綜合知識,跨層定位瓶頸,組合拳出擊。
mpstat 顯示單 CPU 狂忙,其餘閒置jstat:GC 每 5 秒一次,耗時 2 秒,釋放記憶體極少jmap 發現 10,000+ Session 物件堆積。配置 session-timeout=50 分鐘 且無 Logout 介面,導致 Session 長期佔用堆疊。
數天測試證實洩漏徹底解決,GC 回歸正常頻率。
kill -3 線程堆疊:大量執行緒阻塞於連接池 getConnection()DBA 發現所有 DB Session 處於死鎖,佔滿連接池,後續請求永久等待。
解決 DB 端死鎖 (索引優化、鎖順序、隔離級別調整),性能立即恢復。
超大快取導致標記-掃描階段遍歷海量物件,GC 停頓不可接受。
-XX:+UseConcMarkSweepGC 等)最大停頓從 15 分鐘降至 4 秒,滿足 SLA。
mpstat:系統佔用絕大多數 CPUfork() 系統調用消耗最高每請求呼叫 Runtime.getRuntime().exec() 執行 Shell 腳本。JVM 實作:fork() 克隆整個 JVM 進程 → exec() → 退出。高併發下進程創建/銷毀開銷驚人。
移除外部腳本調用,改用純 Java API (如 OperatingSystemMXBean) 獲取系統資訊。
new File() 創建單目錄累積 80 萬檔案,檔案系統為防重名需遍歷目錄項,創建複雜度隨檔案數線性增長。
按日期/用戶/雜湊分桶存儲,單目錄檔案數控制在千級以內,性能大幅提升。
CPU TLB (Translation Lookaside Buffer) 命中率偏低,記憶體存取效率受損。
HotSpot 啟用大頁面:
-XX:+AggressiveHeap
-XX:LargePageSizeInBytes=256m
TLB 命中率顯著提升,整體性能增長近 40%。
mpstat/jstat/jmap/kill -3/DTrace/Profiler