嘘~ 正在从服务器偷取页面 . . .

JVM GC


0、查看JVM 初始化参数

方式一:

jps -l
jinfo -flag 配置项参数  进程编号
jinfo -flags  进程编号

方式二:

(1)查询初始化默认参数命令,该命令类似全局参数,有很多。版本参数非必须。

java -XX:+PrintFlagsInitial -version

(2)查询修改更新的参数命令

java -XX:+PrintFlagsFinal -version

这些参数中 如果 = 变成了 := 表示该参数被Jvm或人为改动过的值。

(3)查询手工设置的参数命令

java -XX:+PrintCommandLineFlags

1、查看默认GC收集器

GC回收类型在jvm里学习了。

实际使用的GC收集器主要有:

  • UseSerialGC
  • UseParallelGC
  • UseConcMarkSweepGC
  • UseParNewGC
  • UseParallelOldGC
  • UseG1GC
java -XX:+PrintCommandLineFlags -version

在Windows运行输出结果

-XX:InitialHeapSize=265759744 -XX:MaxHeapSize=4252155904 -XX:+PrintCommandLineFlags -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:-UseLargePagesIndividualAllocation -XX:+UseParallelGC
java version "1.8.0_191"
Java(TM) SE Runtime Environment (build 1.8.0_191-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.191-b12, mixed mode)

表示的默认jvm环境。

但是实际环境可能是Linux,可以使用管道符,带上参数关键词

java -XX:+PrintCommandLineFlags -version | grep UseParallelGC

也可以通过进程来看

首先找到java进程

jps -l

再看Java进行使用的垃圾收集器:

带上具体的收集器参数确认是否使用该收集器:


jinfo -flag UseParallelGC  12976

打印结果:

-XX:+UseParallelGC

结果解读:UseParallelGC前面 + 表示启用,- 表示禁用。9

方式二:

jinfo -flags  进程编号
jinfo -flags  12976

打印结果:

Attaching to process ID 12976, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 25.191-b12
Non-default VM flags: -XX:CICompilerCount=4 -XX:InitialHeapSize=266338304 -XX:MaxHeapSize=4253024256 -XX:MaxNewSize=1417674752 -XX:MinHeapDeltaBytes=5
24288 -XX:NewSize=88604672 -XX:OldSize=177733632 -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:-UseLargeP
agesIndividualAllocation -XX:+UseParallelGC
Command line:  -agentlib:jdwp=transport=dt_socket,address=127.0.0.1:47214,suspend=y,server=n -javaagent:D:\dev-tools-JetBrains\ideaIU-2020.1.win\ideaI
U-2020.1.win\plugins\java\lib\rt\debugger-agent.jar -Dfile.encoding=UTF-8

结果解读:可以看到存在-XX:+UseParallelGC说明开启了UseParallelGC垃圾收集器。

Non-default VM flags:表示JVM根据系统自自己判断的一些参数。

Command line 表示我们人为调整过的参数。这里暂时没有添加参数,所以无内容。

这种方式还可以看到其他的各种参数,默认单位是字节(byte)(换算四舍五入了)

-XX:InitialHeapSize=266338304 换算成MB,266338304 /1024/1024=254

-XX:MaxHeapSize=4253024256 换算成MB,4253024256 /1024/1024=405

-XX:MaxNewSize=1417674752 换算成MB,1417674752 /1024/1024=135

-XX:NewSize=88604672 换算成MB,88604672 /1024/1024=85

-XX:OldSize=177733632 换算成MB,177733632 /1024/1024=169

2、Server/Client

32位Windows操作系统,不分硬件都默认使用Client的JVM模式

32位其他操作系统,2G内存2个CPU以上用Server模式,低于该配置使用Client模式。

64位操作系统只使用Server模式。

3、GC信息打印

-XX:+PrintGCDetails

4、GC收集器参数

实战操作:

(1)针对springboot内嵌servlet启动容器的:

java -server -Xms=1024 -Xmx=1024 -XX:+UseConcMarkSweepGC -jar springboottest.jar
java -server -Xms=1024 -Xmx=1024 -XX:+UseConcMarkSweepGC -jar springboottest.war

验证参数是否生效:

jps -l 
jinfo -flags 12323

(2)针对传统的Tomcat应用:

启动脚本配置优化:

在bin目录下的catalina.sh或catalina.bat中添加修改配置tomcat使用运行参数;

JAVA_OPTS="$JAVA_OPTS -Xms1024m -Xmx2048m -Xmn5126m -XX:PermSize=384m 
-XX:MaxPermSize=384m -XX:+UseConcMarkSweepGC 
-XX:+UseCMSCompactAtFullCollection -XX:CMSMaxAbortablePrecleanTime=500
-XX:+CMSClassUnloadingEnabled -XX:+CMSClassUnloadingEnabled 
-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager"

在使用并发回收的情况下, 防止 memoryfragmention, 对存活对象进行整理, 使 memory 碎片减少
-XX:+UseParNewGC:对新生代采用多线程并行回收;
-XX:+CMSClassUnloadingEnabled:CMS收集器默认不会对永久代进行垃圾回收
-XX:CMSMaxAbortablePrecleanTime:CMS GC需要经过较多步骤才能完成一次GC的动作,在minor GC较为频繁的情况下,很有可能造成CMS GC尚未完成,从而造成并发失败可以通过-XX: CMSMaxAbortablePrecleanTime设置较小的值,以保证CMS GC尽快完成对象的回收,避免并发失败的现象。

server.xml配置优化



  • connectionTimeout:超时时间,单位毫秒,默认值为60000,即60秒
  • maxThreads:Tomcat起动的最大线程数,默认值为200,启用线程池
  • minSpareThreads:Tomcat初始化时创建的线程数。默认值4,启用线程池
  • prestartminSpareThreads:是否启用最小线程启动。
  • URIEncoding :get请求字符集编码,主要是针对中文编码的。
  • maxProcessors:Tomcat运行时允许创建的最大线程数,默认值为75,一般根据实际生产环境修改。
  • acceptCount:当Tomcat起动的线程数达到最大时,接受排队的请求个数,默认值为100,web server允许的最大连接数还受制于操作系统的内核参数设置,通常Windows是2000个左右,Linux是1000个左右,通常该值设置同maxThreads一样。
  • enableLookups:是否反查域名,默认值为true。为了提高处理能力,应设置为false
  • compression:压缩传输,取值on/off/force,默认值off
  • redirectPort:SSL的重定向端口,默认8443
  • server:修改http的head中服务器的类型,隐藏Tomcat

参考文章

常见的七种垃圾收集器

4.1 UseSerialGC

新生代收集器。

启用之后,年轻代使用Serial,老年代使用Serial Old的组合。

-XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseSerialGC

4.2 UseParNewGC

新生代收集器。

启用之后,年轻代使用ParNew,老年代使用Serial Old的组合,即年轻代复制算法,老年代标记整理算法。

-XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseParNewGC

该并行收集器参数

-XX:ParallelGCThreads

可以限制线程数量,默认开启和CPU数量相同的线程数。

UseParNewGC在jdk8 之后不再推荐使用。

4.3 UseParallelGC

年轻代收集器。Parallel Scavenge 又叫吞吐量优先垃圾收集器。

系统默认的,与UseParallelOldGC互相激活搭配使用。

启用之后,年轻代使用Parallel Scavenge,老年代使用Parallel Old的组合。

-XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseParallelGC

激活参数:-XX:+UseParallelGC-XX:+UseParallelOldGC 均可。

吞吐量和最短停顿2个特殊参数:

参数一:

-XX:MaxGCPauseMillis

该参数是控制最大垃圾收集停顿时间,参数允许的值是一个大于0的毫秒数,收集器将尽力保证内存回收花费的时间不超过用户设定值。

参数二:

-XX:GCTimeRatio

参数的值则应当是一个大于0小于100的整数,也就是垃圾收集时间占总时间的比率,相当于吞吐量的倒数。如把此参数设置为19,那允许的最大垃圾收集时间就占总时间的5%(即1/(1+19)),默认值为99,即允许最大1%(即1/(1+99))的垃圾收集时间。

参数三:

-XX:ParallelGCThreads=N

表示启动多少个GC线程。CPU>8时,N=5/8;CPU < 8时 N=实际参数。

4.4 UseParallelOldGC

老年代收集器。

启用之后,年轻代使用Parallel ,老年代使用Parallel Old的组合。

-XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseParallelOldGC

激活参数:-XX:+UseParallelGC-XX:+UseParallelOldGC 均可。

4.5 UseConcMarkSweepGC

以最小停顿为目标的垃圾收集器。适合B/S架构优化、大应用。

启用之后,年轻代使用UseParNewGC,老年代使用CMS + Serial Old的组合。

-XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseConcMarkSweepGC

激活方法:-XX:+UseConcMarkSweepGC 激活后自带激活 -XX:+UseParNewGC

4.6 UseG1GC

启用之后,面对整堆的G1,Regio布局。只是逻辑上区别年轻代和老年代。整体上使用标记整理算法,局部使用标记复制算法。

-XX:+PrintGCDetails -XX:+PrintCommandLineFlags -XX:+UseG1GC

特有参数:

参数一:

-XX:G1HeapRegion=n

可以用来指定Region分区大小,值是2的幂,范围是1M到32M。G1会根据最小的Java堆划分出2048个区域。

参数二:

-XX:MaxGCPauseMillis=n

预期最大停顿时间,JVM尽可能停顿小于该时间。

参数三:

-XX:InitiatingHeapOccupancyPercent=n

堆区占用多少时就触发GC,相当于一个GC触发临界值,默认是45

参数四:

-XX:ConcGCThreads=n

并发GC使用的线程数。

参数五:

-XX:G1ReservePercent=10

设置作为空闲空间的预留内百分比,以降低目标空间溢出的风险,默认是10%。

还有其他参数:

一般常用的参数设置:

-XX:+UseG1GC -Xmx=32g -XX:MaxGCPauseMillis=200

其他参数根据需要调整。

5、OOM分析

dump出来的堆转存快照进行分析工具:

  • java自带jvisulvm

  • eclipse的MAT插件(menory analyzer tool)

  • idea的jprofiler

6、JVM参数类型

Jvm 参数主要分三类:

  • 标准的参数
  • X参数
  • XX参数

6.1 标准参数

执行java -help命令就可以看到参数列表。如 -version-help

6.2 X参数

-Xint 解析执行

-Xcomp 第一次使用就编译成本地代码

-Xmixed 混合模式

6.3 XX参数 (重点)

XX参数主要有两大类

  • Boolean类型

  • KV设值类型

6.3.1 Boolean 类型

常见模式

  • -XX:+ 表示启用某个参数属性
  • -XX:- 表示禁用某个参数属性

常见示例:

-XX:+PrintGCDetails
-XX:+UseConcMarkSweepGC

查看方式参考jps -ljinfo -flag 命令。

-Xms 等价参数 -XX:InitialHeapSize

-Xmx 等价参数 -XX:MaxHeapSize

-Xss 等价参数 -XX:ThreadStackSize

6.3.2 K-V设值类型

常见模式:

-XX:FiledKey=FiledValue

常见示例:

设值元空间大小,默认值大约21M-XX:MataspaceSize=32M

晋升老年代的最大年龄,默认是15:-XX:MaxTenuringThrehold=15



文章作者: Small-Rose /张小菜
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-SA 4.0 许可协议。转载请注明来源 Small-Rose /张小菜 !
评论
  目录