如何选择垃圾收集器呢
1.优先调整堆的大小,让服务器自己来选择
2.如果内存小于100M,使用串行收集器 SerialGC
3.如果是单核,并且没有停顿时间要求,使用串行或JVM自己选 SerialGC
4.如果允许停顿时间超过1秒,选择并行或JVM自己选 ParallelGC
5.如果响应时间最重要,并且不能超过1秒,使用并发收集器,CMS或者G1
6.对于G1收集
示例:
参数:-XX:+UseConcMarkSweepGC
JVM参数:不仅仅药设置的是垃圾收集器,内存,等等
1.标准参数:不随着jdk版本变化而变化的参数
例如:-version -help
2.非标准参数:-X参数
例如:java -version是mixed mode
java -Xint -version 是解释执行
java -Xcomp -version
3.-XX参数:boolean型,
如: -XX:+UseG1GC 启用
-XX:-UseG1GC 禁用
key:value型
-XX:MaxGCPauseMillis=500
-XX:HeapSize=100MB
(4)其他参数:
-Xms100M --> -XX:InitialHeapSize=100M,
-Xmx --> -XX:MaxHeapSize=100M,
-Xss --> -XX:ThreadStackSize=xxx
-XX:+PrintFlagsFinal可以打印jvm参数
打印出来的有冒号的表示是修改过的值
JVM常用参数含义
参数 | 含义 | 说明 |
-XX:CICompilerCount | 最大并行编译数 | 如果设置大于1,虽然编译速度会提高,但是同样影响系统稳定性,会增加JVM崩溃的可能 |
-XX:InitialHeapSize=100M | 初始化堆大小 | 简写-Xms100M |
-XX:MaxHeapSize=100M | 最大堆大小 | 简写-Xmx100M |
-XX:NewSize=20M | 设置年轻代的大小 | |
-XX:MaxNewSize=50M | 设置最大年轻代大小 | |
-XX:OldSize=50M | 设置老年代大小 | |
-XX:MetaspaceSize=50M | 设置元空间大小(方法区) | |
-XX:MaxMetaspaceSize=50M | 方法区最大大小 | |
-XX:+UseParallelGC | 使用UseParallelGC | 新生代,吞吐量优先 |
-XX:+UseParallelOldGC | 使用UseParallelOldGC | 老年代,吞吐量优先 |
-XX:+UseConcMarkSweepGC | 使用CMS | 老年代,停顿时间优先 |
-XX:+UseG1GC | 使用G1 | 新生代,老年代,停顿时间优先 |
-XX:NewRatio | 新老生代的比值 | 比如-XX:NewRatio=4,则标识新生代:老年代=1:4,也就是新生代占整个堆内存的1/5 |
-XX:SurvivorRatio | 两个S区和Eden区的比值 | 比如-XX:SurvivorRatio=8,也就是(S0+S1):Eden=2:8,也就是一个S占整个新生代的1/10 |
-XX:+HeapDumpOnOutOfMemoryError | 启动堆内存溢出打印 | 当JVM堆内存发生溢出时,也就是OOM,自动生成dump文件 |
-XX:HeapDumpPath=heap.hprof | 指定堆内存溢出打印目录 | 表示在当前目录生成一个heap.hprof文件 |
-XX:+PrintGCDetails -XX:+PrintGCTimeStamps -XX:+PrintGCDateStamps -Xloggc:$CATALINA_HOME/logs/gc.log |
打印出GC日志 | 可以使用不同的垃圾收集器,对比查看GC情况 |
-Xss128K | 设置每个线程的堆栈大小 | 经验值是3000-5000最佳 |
-XX:MaxTenuringThreshold=6 | 提升老年代的最大临界值 | 默认值为15 |
-XX:InitiatingHeapOccupancyPercent=45 | 启动并发GC周期时堆内存使用占比 | G1之类的垃圾收集器用它来触发并发GC周期,基于整个堆的使用率,而不只是某一代内存的使用比。值为0,则表示“一直执行GC循环”,默认值为45 |
-XX:G1HeapWastePercent | 允许的浪费堆空间的占比 | 默认是10%,如果并发标记可回收的空间小于10%,则不会出发MixedGC |
-XX:MaxGCPauseMillis=200ms | G1最大停顿时间 | 暂停时间不能太小,太小的话就会导致出现G1跟不上垃圾产生的速度,最终退化成FullGC.所以堆这个参数的调优是一个持续的过程,逐步调整到最佳状态。 |
-XX:ConcGCThreads=n | 并发垃圾收集器使用的线程数量 | 默认值随JVM运行的平台不同而不同 |
-XX:G1MixedGCLiveThresholdPercent=65 | 混合垃圾回收周期中要包括的旧区域设置占用率阈值 | 默认占用率为65% |
-XX:G1MixedGCCountTarget=8 | 设置标记周期完成后,对存活数据上限为G1MixedGCLiveThresholdPercent的旧区域执行混合垃圾回收的目标次数 | 默认8次混合垃圾回收,混合回收的目标是要控制在次目标次数以内 |
-XX:G1OldCSetRegionThresholdPercent=1 | 描述Mixed GC时,Old Region被加入到Set中 | 默认情况下,G1只把10%的Old Region加入到Cset中 |
常见命令和工具
JAVA进程--->jps
1.jps:查看当前的java进程
2.jinfo:实时查看和调整JVM参数
例如:jinfo -flag InitialHeapSize PID 实时查看某个JAVA进程的初始化堆内存大小
或者:jinfo -flags PID 查看进程的所有JVM参数
3.实时修改JVM参数
jinfo -flag name = value PID
如果要对参数进行实时调整:则需要看到参数后面有manageable的才能被实时调整
查看虚拟机性能信息
jstat -calss PID 1000 10 查看类装载信息:查看class在过去10秒钟的的某一个进程的装载信息
除此之外,还可以打印GC的信息
jstat -gc PID 1000 10
jstack pid
查看当前java进程中有多少个线程,以及每个线程的状态
比如写了一个死锁,可以快速排查
Thread--->优雅名字--->order-t1 Thread-0 /1/2/3/4
jmap:查看堆存储快照
jmap -heap PID
新生代42.5M,老年代85.5M
heap:如果在生产环境,堆内存发生OOM的时候,能够自动把堆内存信息打印出来就好了 ,heap信息打印出来,排查,哪些对象占用
dump出堆内存相关的信息
(1)手动
jmap -dump:format=b,file=heap.hprof PID ,这个文件是看不懂的,需要用到工具
介绍几款:
①jconsole,jdk自带的
②jvisualvm,jdk自带的,可以装个插件看内存使用情况,插件名称:com-sun-tools-visualvm-modules-visualgc.nbm去百度搜索下载吧
如果检测到死锁,这里会显示:
还可以添加远端的服务器,监控远程服务器
不是jdk自带的---> Arthas
以上可以看到:线程,cpu,class,堆内容简单情况
(2)自动
能够在发生OOM的时候,自动dump下来就在前面的参数设置
-XX:+HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=heap.hprof |
注意:本文归作者所有,未经作者允许,不得转载