JVM - 應用JVM核心參數推薦設置

在這裏插入圖片描述

Pre

JVM-08垃圾收集Garbage Collection【GC常用參數】

在這裏插入圖片描述


JDK版本

= 1.8


核心參數

在這裏插入圖片描述

‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M 

在這裏插入圖片描述


線程棧

默認1M , 不足的話 StackOverflowError

-Xss設置越小 ,說明一個線程棧裏能分配的棧幀就越少,但是對JVM整體來說能開啓的線程數會更多 ,當然了,線程多了並不一定性能就高,只是理論上是這樣的。


方法區(元空間)

 -XX:MetaspaceSize=N  -XX:MaxMetaspaceSize=N 

【參數解讀】

  • -XX:MaxMetaspaceSize: 元空間最大值, 默認不限制, 取決於機器本身的內存
  • -XX:MetaspaceSize: 元空間的初始空間大小, 默認21M,達到該值就會觸發full gc進行類型卸載, 同時GC收集器會對該值進行調整: 如果釋放了大量的空間, 就適當降低該值; 如果釋放了很少的空間, 那麼在不超過MaxMetaspaceSize的情況下, 適當提高該值的大小(類似自動擴容)。

對於64位JVM來說,元空間的默認初始大小是21MB,若不足,GC後自動擴容,無上限,取決於操作系統的內存大小。


【經驗之談】

一般建議在JVM參數中將MetaspaceSize和MaxMetaspaceSize設置成一樣的值 ,8G物理內存的機器來說,可以將這兩個參數設置爲256M

如果應用啓動比較慢,可以看下是不是因爲方法區的JVM參數沒有設置(默認值21 ,頻繁GC,自動擴容)導致的。


棧溢出案例 StackOverflowError

/**
 * ‐Xss驗證
 */
public class StackOverFlowErrorTest {
    private static int count = 0 ;

    public static void main(String[] args) {
        try {
            doCall();
        }catch (Throwable e){
            e.printStackTrace();
            System.out.println("遞歸調用次數:" + count);
        }

    }

    private static  void doCall()    {
        count++;
        // 遞歸調用,壓入線程棧
        doCall();
    }
}

默認配置 -Xss1m

java.lang.StackOverflowError
	at com.artisan.gof.test.StackOverFlowErrorTest.doCall(StackOverFlowErrorTest.java:23)
	........
	........
	........
	at com.artisan.gof.test.StackOverFlowErrorTest.doCall(StackOverFlowErrorTest.java:23)
遞歸調用次數:20898

在這裏插入圖片描述

在這裏插入圖片描述

原因分析

在這裏插入圖片描述

遞歸調用導致棧溢出~


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章