一般的Java項目需要JVM調優嗎?
首先,直接答復一次題主的問題,一般項目肯定是不需要進行JVM調優的,因為JVM 本身就是為這種低延時、高并發、大吞吐的服務設計和優化的,我們很少需要去改變什么。所以,我們往往更偏重于應用服務本身的調優。
在一些應用中,比如大數據計算引擎,是一種非常極端的JVM應用,對延時的要求并不高,但對吞吐量要求很高,會有大量的短生命周期對象產生,同時也有大量的對象生存時間非常久,我們就需要對特定的一些 JVM 參數進行修改,不斷調整,做到最優。
再比如生產環境中出現內存溢出,我們需要判斷是由于大峰值下沒有限流,瞬間創建大量對象而導致的內存溢出,還是是由于內存泄漏而導致的內存溢出。對于內存泄漏導致的,這種問題就是程序的 Bug,我們需要及時找到問題代碼進行修改,而不是調整 JVM。
如果要調優,需要有參考指標,不要為了調優而調優,要有一個目標參考值,最終要達到什么樣的調優結果,沒有指標的調優都是瞎指揮!以下列出幾個衡量系統性能的常用指標:
響應時間:響應時間是衡量系統性能的重要指標之一,響應時間越短,性能越好,一般一個接口的響應時間是在毫秒級。響應時間還包括數據庫響應時間、服務端響應時間、網絡響應時間、客戶端響應時間。TPS:指系統接口的 TPS(每秒事務處理量),因為 TPS 體現了接口的性能,TPS 越大,性能越好。在系統中,吞吐量分為兩種:磁盤吞吐量和網絡吞吐量。計算機資源分配使用率:通常由 CPU 占用率、內存使用率、磁盤 I/O、網絡 I/O 來表示資源使用率。這幾個參數好比一個木桶,如果其中任何一塊木板出現短板,任何一項分配不合理,對整個系統性能的影響都是毀滅性的。對于JVM調優來說,主要關注以下兩方面:JVM內存空間分配參數設置和垃圾回收器的選擇。
內存空間的分配設置:JVM 內存分配不合理帶來的性能表現并不會像內存溢出問題這么突出,最直接的表現就是頻繁的 GC,這會導致上下文切換等性能問題,從而降低系統的吞吐量、增加系統的響應時間。具體的實現包括調整堆內存空間減少 Full GC、調整年輕代減少 MinorGC、設置合理的 Eden 和 Survivor 區的比例。選擇合適的垃圾回收器:垃圾回收主要是指堆和方法區的回收,堆中的回收主要是對象的回收,方法區的回收主要是廢棄常量和無用的類的回收。垃圾收集器的種類很多,不同的場景有不同的選擇。對于每次操作的響應時間要求比較高的,我們可以選擇響應速度較快的 GC回收器,比如 CMS 回收器和 G1 回收器;而對系統吞吐量有較高要求時,就可以選擇 Parallel Scavenge 回收器來提高系統的吞吐量。