博客 / 詳情

返回

JVM 21 調優指南:如何進行JVM調優,JVM調優參數

聊聊關於JVM 21的優化指南。這篇文章將會深入探討如何進行JVM調優,介紹一些關鍵的JVM調優參數,並提供12個實用的代碼示例。由於篇幅較長,我會分幾個部分來詳細講解,之前寫的也有33篇系列教程JVM調優實戰打擊也可以去圍觀。

JVM調優概覽

JVM(Java虛擬機)調優是一個複雜但重要的任務,特別是在處理大型、複雜的應用程序時。JVM調優的目的是優化JVM的性能,以提高應用程序的響應速度和處理能力。JVM 21引入了一些新的優化特性和參數,使得調優工作更加高效。

本文已收錄於,我的技術網站 ddkk.com,有大廠完整面經,工作技術,架構師成長之路,等經驗分享

JVM調優參數

JVM調優通常涉及到以下幾個方面的參數:

1、內存管理參數:

-Xms-Xmx:設置堆的初始大小和最大大小。

-XX:NewSize-XX:MaxNewSize:設置新生代的初始大小和最大大小。

-XX:PermSize-XX:MaxPermSize:設置永久代(在JDK 8之後被元空間Metaspace替代)的大小。

2、垃圾收集器參數:

-XX:+UseG1GC:啓用G1垃圾收集器。

-XX:GCTimeRatio:設置吞吐量大小。

-XX:MaxGCPauseMillis:設置最大垃圾收集停頓時間。

3、性能監控參數:

-XX:+PrintGCDetails:打印垃圾回收的詳細信息。

-XX:+UseGCLogFileRotation:啓用GC日誌文件的自動旋轉。

12個實戰案例

現在,讓我們來看幾個實用的代碼示例,這些示例將幫助你更好地理解JVM調優的實踐操作。

示例1:基本的JVM內存設置

// 示例代碼:設置JVM的初始堆大小和最大堆大小
public class JvmMemoryExample {
    public static void main(String[] args) {
        // 這裏的代碼主要用於展示,實際JVM的參數設置是在啓動JVM時通過命令行完成的
        System.out.println("JVM Memory Example");
    }
}

啓動參數:

java -Xms512m -Xmx1024m JvmMemoryExample

這個示例中,我們設置了JVM的初始堆大小為512MB,最大堆大小為1024MB。

示例2:使用G1垃圾收集器

// 示例代碼:使用G1垃圾收集器
public class G1GCExample {
    public static void main(String[] args) {
        // G1垃圾收集器的使用主要是通過JVM啓動參數來設置
        System.out.println("G1 Garbage Collector Example");
    }
}

啓動參數:

java -XX:+UseG1GC G1GCExample

在這個示例中,我們通過JVM參數啓用了G1垃圾收集器。

示例3:打印GC詳細信息

// 示例代碼:打印GC的詳細信息
public class GCDetailsExample {
    public static void main(String[] args) {
        // 打印GC詳細信息是通過JVM參數來實現的
        System.out.println("GC Details Example");
    }
}

啓動參數:

java -XX:+PrintGCDetails GCDetailsExample

這裏,我們通過JVM參數來打印垃圾回收的詳細信息。

示例4:設置最大停頓時間目標

這個示例演示瞭如何設置垃圾回收的最大停頓時間目標,以減少垃圾回收對應用性能的影響。

// 示例代碼:設置最大停頓時間目標
public class MaxGCPauseMillisExample {
    public static void main(String[] args) {
        // 設置最大停頓時間是通過JVM啓動參數實現的,代碼本身不涉及
        System.out.println("Max GC Pause Millis Example");
    }
}

啓動參數:

java -XX:MaxGCPauseMillis=200 MaxGCPauseMillisExample

這個參數設置了垃圾回收的最大停頓時間為200毫秒。

示例5:使用並行垃圾收集器

這個示例展示瞭如何啓用並行垃圾收集器,這有助於在多核處理器上提高垃圾回收的效率。

// 示例代碼:使用並行垃圾收集器
public class ParallelGCExample {
    public static void main(String[] args) {
        // 啓用並行垃圾收集器是通過JVM啓動參數來設置的
        System.out.println("Parallel Garbage Collector Example");
    }
}

啓動參數:

java -XX:+UseParallelGC ParallelGCExample

這個參數啓用了並行垃圾收集器,利用多核處理器來提高垃圾回收效率。

示例6:開啓GC日誌和日誌文件輪換

這個示例演示瞭如何開啓GC日誌記錄,並且啓用日誌文件輪換功能,以便更好地管理和分析GC日誌。

// 示例代碼:開啓GC日誌和日誌文件輪換
public class GCLogExample {
    public static void main(String[] args) {
        // 開啓GC日誌和日誌文件輪換是通過JVM參數實現的
        System.out.println("GC Log and Log Rotation Example");
    }
}

啓動參數:

java -XX:+PrintGC -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=10M GCLogExample

這些參數組合實現了開啓GC日誌記錄,並設置了日誌文件輪換,保持最多5個GC日誌文件,每個文件大小不超過10MB。

示例7:開啓線程本地分配緩衝(TLAB)

這個示例演示瞭如何開啓線程本地分配緩衝(TLAB),這是一種優化技術,可以減少線程間的競爭,提高對象分配的效率。

// 示例代碼:開啓線程本地分配緩衝(TLAB)
public class TLABExample {
    public static void main(String[] args) {
        // 開啓TLAB是通過JVM參數實現的
        System.out.println("Thread Local Allocation Buffer (TLAB) Example");
    }
}

啓動參數:

java -XX:+UseTLAB TLABExample

通過這個參數,JVM會為每個線程分配一個本地緩衝區,用於對象分配,從而減少線程間的競爭。最近無意間獲得一份阿里大佬寫的刷題筆記,一下子打通了我的任督二脈,進大廠原來沒那麼難。這是大佬寫的, 七千頁的BAT大佬寫的刷題筆記,讓我offer拿到手軟

示例8:設置元空間大小

元空間(Metaspace)是存放類元數據的區域。這個示例展示瞭如何設置元空間的大小,避免因元空間不足而導致的問題。

// 示例代碼:設置元空間大小
public class MetaspaceSizeExample {
    public static void main(String[] args) {
        // 設置元空間大小是通過JVM參數來實現的
        System.out.println("Metaspace Size Example");
    }
}

啓動參數:

java -XX:MetaspaceSize=128m -XX:MaxMetaspaceSize=256m MetaspaceSizeExample

這裏我們設置了元空間的初始大小為128MB,最大大小為256MB。

示例9:開啓類數據共享(CDS)

類數據共享(CDS)可以加快JVM的啓動速度,並減少運行時內存的佔用。這個示例演示瞭如何開啓CDS。

// 示例代碼:開啓類數據共享(CDS)
public class CDSExample {
    public static void main(String[] args) {
        // 開啓CDS是通過JVM參數實現的
        System.out.println("Class Data Sharing (CDS) Example");
    }
}

啓動參數:

java -XX:+UseCDS CDSExample

通過這個參數,JVM會嘗試共享常用類的數據,以此來提高性能。

示例10:設置年輕代和老年代的比例

在JVM中,堆內存被分為年輕代和老年代。合理設置這兩者的比例可以優化垃圾收集的性能。

// 示例代碼:設置年輕代和老年代的比例
public class YoungOldGenerationRatioExample {
    public static void main(String[] args) {
        // 設置年輕代和老年代的比例是通過JVM參數來實現的
        System.out.println("Young/Old Generation Ratio Example");
    }
}

啓動參數:

java -XX:NewRatio=2 YoungOldGenerationRatioExample

這個參數設置年輕代(New Generation)與老年代(Old Generation)的大小比例為1:2。

示例11:開啓字符串去重

字符串去重是JVM在Java 8u20及以後版本引入的一個特性,可以減少重複字符串的內存佔用,提高性能。

// 示例代碼:開啓字符串去重
public class StringDeduplicationExample {
    public static void main(String[] args) {
        // 開啓字符串去重是通過JVM參數來實現的
        System.out.println("String Deduplication Example");
    }
}

啓動參數:

java -XX:+UseStringDeduplication StringDeduplicationExample

這個參數啓用了字符串去重功能,幫助節省內存空間。

示例12:設置代碼緩存大小

代碼緩存是JVM中存儲已編譯方法的地方。調整代碼緩存的大小可以影響編譯方法的數量和性能。

// 示例代碼:設置代碼緩存大小
public class CodeCacheSizeExample {
    public static void main(String[] args) {
        // 設置代碼緩存大小是通過JVM參數來實現的
        System.out.println("Code Cache Size Example");
    }
}

啓動參數:

java -XX:InitialCodeCacheSize=32m -XX:ReservedCodeCacheSize=64m CodeCacheSizeExample

這些參數設置了代碼緩存的初始大小為32MB,最大保留大小為64MB。

結語

以上示例展現了JVM調優的不同方面,包括內存管理、性能優化和資源利用率的提升。之前寫的也有33篇系列教程JVM調優實戰打擊也可以去圍觀。每個應用的具體情況都不盡相同,因此在進行JVM調優時,需要根據實際情況進行細緻的調整和測試。希望這些示例能夠為你掌握JVM調優提供實用的參考。記住,有效的JVM調優策略是基於對應用性能和資源使用的深入瞭解。持續監控和適時調整,才能確保應用的最佳性能。

本文已收錄於,我的技術網站 ddkk.com,有大廠完整面經,工作技術,架構師成長之路,等經驗分享

user avatar an_653b347d1d3da 頭像
1 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.