一、JVM參數調優
-Xms(初始堆大?。┖?code>-Xmx(最大堆大?。﹨祵⒍褍却婀潭橄嗤担ㄈ?code>-Xms4g -Xmx4g),避免運行時JVM動態調整堆大小導致的性能波動(如Full GC觸發)。-XX:+UseG1GC),平衡吞吐量與低延遲;低延遲場景可選用ZGC(-XX:+UseZGC,需Java 11+)或Shenandoah(-XX:+UseShenandoahGC);傳統CMS(-XX:+UseConcMarkSweepGC)適用于低延遲但已逐漸被取代。-XX:MaxGCPauseMillis設定期望的最大GC停頓時間(如-XX:MaxGCPauseMillis=200,單位毫秒),指導GC算法調整以減少停頓對應用的影響。-XX:NewRatio(新生代與老年代比例,默認2,即新生代占1/3)和-XX:SurvivorRatio(Eden區與Survivor區比例,默認8,即Eden占80%),優化對象晉升頻率(如高頻創建短期對象的場景可增大新生代比例)。-XX:+UseCompressedOops(默認開啟)減少內存占用(64位JVM下對象引用從8字節壓縮到4字節),提高內存訪問速度。二、代碼層面優化
String str = new String("abc")改為String str = "abc",利用字符串常量池),重用對象(如使用StringBuilder代替+拼接字符串)。this.instanceVar改為局部變量localVar)。for(int i=0; i<list.size(); i++)改為int size=list.size(); for(int i=0; i<size; i++)),減少重復計算。HashMap(O(1)時間復雜度),有序數據用TreeMap(O(log n)),隊列用LinkedList(插入刪除O(1));避免使用Vector、Hashtable等同步容器(除非需要線程安全)。synchronized方法改為synchronized代碼塊),使用并發集合(如ConcurrentHashMap、CopyOnWriteArrayList)替代同步集合,降低線程阻塞。三、系統資源優化
/etc/sysctl.conf優化網絡與內存——net.core.rmem_max=16777216(接收緩沖區最大值)、net.core.wmem_max=16777216(發送緩沖區最大值)提升網絡吞吐;vm.swappiness=10(默認60,值越低越少使用交換空間)減少磁盤IO(交換空間會顯著降低性能)。/etc/security/limits.conf增加進程可打開的文件描述符數(如* soft nofile 65535、* hard nofile 65535),避免高并發場景下因文件描述符耗盡導致的連接失敗。deadline或noop(echo deadline > /sys/block/sda/queue/scheduler),機械硬盤推薦cfq(已逐漸被淘汰),減少I/O等待時間。free -h查看swap使用率,若長期高于20%需調整)。四、多線程與并發優化
Runtime.getRuntime().availableProcessors())設置線程池大小——CPU密集型任務(如計算)設為核心數+1,IO密集型任務(如數據庫訪問)設為核心數*2(避免過多線程導致上下文切換開銷)。java.util.concurrent包下的工具類——CountDownLatch(線程同步)、CyclicBarrier(多線程匯合)、Semaphore(限流)、BlockingQueue(生產者-消費者模型),替代手動同步(如synchronized)。synchronized修飾整個方法(如將方法內的非臨界區代碼移出同步塊),使用細粒度鎖(如ConcurrentHashMap的分段鎖),或采用樂觀鎖(如CAS操作,AtomicInteger)。Selector)、異步編程(如CompletableFuture、Reactive Programming(如Spring WebFlux)),提高IO密集型任務的響應速度。五、數據庫訪問優化
SELECT *(僅查詢必要字段),添加合適的索引(如WHERE條件、JOIN字段),優化復雜查詢(如拆分大查詢、使用臨時表),避免子查詢嵌套過深。maximumPoolSize(最大連接數,建議不超過數據庫最大連接數的80%)、connectionTimeout(連接超時時間,默認30秒)),減少連接創建與銷毀的開銷。PreparedStatement的addBatch()與executeBatch()方法批量插入/更新數據(如INSERT INTO table VALUES (?, ?), (?, ?)),減少數據庫往返次數。六、性能監控與分析
jstat監控GC情況(jstat -gcutil <pid> 1000,每秒輸出一次GC統計)、jmap生成堆轉儲(jmap -dump:format=b,file=heap.hprof <pid>,分析內存泄漏)、jstack查看線程棧(jstack <pid>,分析線程阻塞),或使用圖形化工具(如VisualVM、Java Mission Control、JProfiler)實時監控JVM內存、CPU、線程等指標。top(查看CPU使用率)、free(查看內存使用)、df(查看磁盤空間)、iotop(查看磁盤IO)、netstat/ss(查看網絡連接)等命令,定位系統瓶頸(如CPU過高可能是代碼計算密集,IO過高可能是數據庫查詢慢)。