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。为了提高处理能力,应设置为falsecompression
:压缩传输,取值on/off/force,默认值offredirectPort
:SSL的重定向端口,默认8443server
:修改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 -l
和 jinfo -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