JVM参数之ParallelGCThreads

通过命令查看参数: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

 

posted @ 2020-09-17 20:41  晓等  阅读(17575)  评论(0编辑  收藏  举报