jvm常用调优策略

jvm参数类型:
(了解 不常用)
-xint:解释执行
-Xcomp:编译执行
-Xmixed:混合模式,jvm自己决定使用哪种方式

(重点)
分为boolean类型:
-XX:[+-]<name> 表示是否启用jvm的某个参数

非boolean类型:
-XX:<name> = <value> 表示name属性的值为value

-Xms:初始对内存大小(-XX:initialHeapSize)
-Xmx:最大堆内存大小(-XX:MaxHeapSize)

jps:查看java的相关进程

jinfo:产看正在运行的jvm的参数
格式如下:
-flag <name>         to print the value of the named VM flag
    -flag [+|-]<name>    to enable or disable the named VM flag
    -flag <name>=<value> to set the named VM flag to the given value
    -flags               to print VM flags
    -sysprops            to print Java system properties
    <no option>          to print both of the above
    -h | -help           to print this help message
eg : jinfo -flag MaxHeapSize 2122 会打印出jvm的最大堆内存值

jstat:查看jvm的统计信息(包括类加载信息,垃圾收集信息,jit编译信息)
(1)查看类加载信息 ; 
jstat -class jvm进程id internal(表示隔多少ms查询一次) time(一共查询多少次)
eg : jstat -class 2122 1000 10
(2)查看垃圾收集信息:
jstat -gc jvmPid 1000 10
jstat -gcutil jvmPid 1000 10
jstat -gccause jvmPid 1000 10

jmap + MAT实战内存溢出
<1>自动导出
( 1 )设置jvm在内存溢出时dump出内存映像文件
jinfo -flag +HeapDumpOnOutOfMemoryError jvmPid
( 2 )设置dump出的文件位置:
jinfo -flag HeapDumpPath=路径 jvmPid

<2>手动导出
jmp -dump:live,format=b,file=文件导出路径 jvmPid(或者是线程id,以上都是)

实战死循环,死锁
<1>使用top命令,查看那些进程cpu标高
<2>使用top -p 进程pid -H 产看该进程 上的所有线程
<3>printf "%x" 十进制的线程id 将十进制的线程id 转换为16进制的
<4>jstack pid 来查看具体的线程状态

gc调优:
-Xms32M 最小堆内存
-Xmx32M 最大堆内存
-XX:NewSize 新生代大小
-XX:MaxNewSize 最大新生代大小
-XX:NewRatio 新生代老年代之间的比例
-XX:SurvivorRatio eden survivor之间的比例
-XX:MetaSpaceSize MetaSpace大小
-XX:MaxMetaSpaceSize metaspace最大空间
-XX:+UseCompressedClassPointers 启用ccs空间
-XX:CompressedClassSpaceSize ccs的大小
-XX:InitialCodeCacheSize codeCache的大小
-XX:ReservedCodeCacheSize codecache最大大小
-XX:ParallelGCThreads=n 设置并行垃圾收集器的线程数 cpu > 8 默认开启 5/8 cpu小于8 默认开启的数量与cpu相同

开启垃圾收集器:
webServer模式下主要使用并行收集器和并发收集器
并行收集器:parallel scavenge 特性:自适应的调整
自适应调整的参数,每次增大或减小多少
-XX:YoungGenerationSizeIncrement=20 young区每次增大20%
-XX:TenuredGenerationSizeIncrement=20 old区的调整
-XX:AdaptiveSizeDecrementScaleFactor=4 每个区减少的比例

并发收集器:cms g1

ps收集器 又叫做吞吐量优先收集器 使用两个参数来达到指定的吞吐量
-XX:MaxGCPauseMillis 最大gc停顿时间 这个参数的设置是以牺牲吞吐量为代价的
-XX:GCTimeRatio gc占用的时间 计算公式为 1/(1 + 19) 19就是gc占用的时间

(1)开启串行收集器:-XX:+UseSerialGC  -XX:+UseSerialOldGC
(2)开启并行收集器:-XX:+UseParallelGC -XX:+UseParallelOldGC
(3)开启并发收集器:-XX:+UseConcMarkSweepGC -XX:+UseParNewGC

cms相关参数:
-XX:ConcGCThreads 并发的gc线程数(与应用程序并发执行的gc线程)
-XX:+UseCMSCompactAtFullCollection fullgc之后进行空间压缩
-XX:CMSFullGCsBeforeCompaction 多少次fullgc之后进行一次压缩
-XX:CMSInitiatingOccupancyFranction old区占用多少之后触发fullgc
-XX:+UseCMSInitiatingOccpancyOnly 触发fullgc的old区的占有率是否可以调
-XX:+CMSScavengeBeforeRemark fullgc之前先做younggc
-XX:+CMSClassUnloadingEnabled:启用回收perm区

g1相关参数:
-XX:UseG1GC 开启g1gc
-XX:G1HeapRegionSize=n region的大小 1-32m之间 2048个
-XX:MaxGCPauseMillis=200 最大停顿时间
-XX:G1NewSizePercent young区大小
-XX:G1MaxNewSizePercent young区最大大小
-XX:G1ReservePercent=10 保留young区中 to空间的大小,防止to空间溢出
-XX:ParallelGCThreads=n 垃圾回收的并行线程数,用在初始标记和最终标记
-XX:ConcGCThreads=n 并发的线程数=1/4*并行的线程数

-XX:InitiatingHeapOccupancyPercent=45 堆占有率达到多少触发并发标记,默认为45%
-XX:G1MixedGCLiveThresholdPercent=85 old region中存活的对象达到多少触发mixGC 默认85%
-XX:G1HeapWastePercent=5 并发标记之后得到可以回收的垃圾空间,垃圾空间大于该值触发mixGC(mixgc会吧oldregion中的对象添加到eden 和 survior中)
-XX:G1MixedGCCountTarget=8 mixgc的次数 默认是8次
-XX:G1OldCSetRegionThresholdPercent=10 mixGC中,最多有多少oldRegion区可以放在CSet中

g1最佳实践:
(1)不要显示的设置-Xmn -XX:NewRatio等值的大小,设置之后,会覆盖掉-XX:MaxGCPauseMillis的值
(2)-XX:MaxGCPauseMillis 不要设置的太严格,太严格会影响到吞吐量


如何选择垃圾收集器:
(1)优先调整堆的大小,让jvm自己选择
(2)内存小于100M,使用串行垃圾收集器
(3)单核没有停顿时间的要求,使用串行,或者jvm自己选择
(4)允许停顿时间超过1s 选择并行或者jvm自己选择
(5)若响应时间重要,使用并发收集器

可视化gc日志:
打印日志相关的参数:
-XX:+PrintGCDetails 显示gc详细信息
-XX:+PrintGCTimeStamps gc时间戳
-XX:+PrintGCDateStamps gc开始的时间
-XLoggc:$CATALINA_HOME/logs/gc.log gc的存放位置
-XX:+PrintHeapAtGC 发生gc时打印出堆栈信息
-XX:+PrintTenuringDistribution 打印出对象的分布情况
(1)http://gceasy.io
(2)GCViewer

parallelGC调优:
首先根据工具来增大频繁gc的区域比如增大perm区的大小,或者metaspace的大小
之后使用参数-XX:GCTimeRatio -XX:MaxGCPauseMillis 来自动的调整
最后使用-XX:YoungGenerationSizeIncrement 来调整每次youngGC之后young区的大小

JVM字节码指令:
 

猜你喜欢

转载自blog.csdn.net/qq_32182461/article/details/82931190
今日推荐