通過命令查看參數:java -XX:+PrintFlagsFinal –version | grep 參數關鍵字,來查看當前參數是否被使用
1、查看線上運行的jvm的gc線程數:
java -XX:+PrintFlagsFinal -version | grep ParallelGCThreads
2、對於並行gc收集器:
2.1、比如ps的時候:
-XX:ParallelGCThreads={value} 這個參數是指定並行 GC 線程的數量,一般最好和 CPU 核心數量相當。默認情況下,當 CPU 數量小於8, ParallelGCThreads 的值等於 CPU 數量,當 CPU 數量大於 8 時,則使用公式:ParallelGCThreads = 8 + ((N - 8) * 5/8) = 3 +((5*CPU)/ 8);同時這個參數只要是並行 GC 都可以使用,不只是 ParNew。
由於GC操作會暫停所有的應用程序線程,JVM為了盡量縮短停頓時間就必須盡可能地利用更多的CPU資源。這意味着,默認情況下,JVM會在機器的每個CPU上運行一個線程,最多同時運行8個。一旦達到這個上限,JVM會調整算法,每超出5/8個CPU啟動一個新的線程。所以總的線程數就是(這里的N代表CPU的數目):ParallelGCThreads = 8 + ((N - 8) * 5/8)
有時候使用這個算法估算出來的線程數目會偏大。如果應用程序使用一個較小的堆(譬如大小為1 GB)運行在一個八顆CPU的機器上,使用4個線程或者6個線程處理這個堆可能會更高效。在一個128顆CPU的機器上,啟動83個垃圾收集線程可能也太多了,除非系統使用的堆已經達到了最大上限。
2.2、cms的時候:
-XX:ParallelGCThreads 由於是並行處理器,當然也可以指定線程數。
默認並發線程數是:(ParallelGCThreads + 3)/ 4)
附帶:
1、CPU總核數 = 物理CPU個數 * 每顆物理CPU的核數
2、總邏輯CPU數 = 物理CPU個數 * 每顆物理CPU的核數 * 超線程數
3、相關命令:
3.1、查看CPU信息(型號)[root@AAA ~]# cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
28 Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz
3.2、查看物理CPU個數 [root@AAA ~]# cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
1
3.3、查看每個物理CPU中core的個數(即核數) [root@AAA ~]# cat /proc/cpuinfo| grep "cpu cores"| uniq
cpu cores : 14
3.4、查看邏輯CPU的個數 [root@AAA ~]# cat /proc/cpuinfo| grep "processor"| wc -l
12