jvm参数
-XX:+或-XX:-的参数,表示该参数类型是boolean 类型,+表示开启,-表示 关闭
-XX:参数名= 参数值,表示 key ,value值类型,
如-Xms这类是特殊的 key,value值类型,
我们可以用jdk自带工具 jinfo 去查看jvm参数的设置
jinfo -flags 进程号
jinfo -flags 参数名 进程号
参数名称 | 含义 | 默认值 | 解释 |
---|---|---|---|
-Xms | 初始堆大小 | 物理内存的1/64(<1GB) | 默认(MinHeapFreeRatio参数可以调整)空余堆内存小于40%时,JVM就会增大堆直到-Xmx的最大限制. |
-Xmx | 最大堆大小 | 物理内存的1/4(<1GB) | 默认(MaxHeapFreeRatio参数可以调整)空余堆内存大于70%时,JVM会减少堆直到 -Xms的最小限制 |
-Xmn | 年轻代大小(1.4or lator) | 注意:此处的大小是(eden+ 2 survivor space).与jmap -heap中显示的New gen是不同的。整个堆大小=年轻代大小 + 年老代大小 + 持久代大小.增大年轻代后,将会减小年老代大小.此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8 | |
-XX:NewSize | 设置年轻代大小(for 1.3/1.4) | ||
-XX:MaxNewSize | 年轻代最大值(for 1.3/1.4) | ||
-XX:PermSize | 设置持久代(perm gen)初始值 | 物理内存的1/64 | |
-XX:MaxPermSize | 设置持久代最大值 | 物理内存的1/4 | |
-Xss | 每个线程的堆栈大小 | JDK5.0以后每个线程堆栈大小为1M,以前每个线程堆栈大小为256K.更具应用的线程所需内存大小进行 调整.在相同物理内存下,减小这个值能生成更多的线程.但是操作系统对一个进程内的线程数还是有限制的,不能无限生成,经验值在3000~5000左右,一般小的应用, 如果栈不是很深, 应该是128k够用的 大的应用建议使用256k。这个选项对性能影响比较大,需要严格的测试。 | |
-XX:NewRatio | 表示年轻代和老年代的占比 | 默认是 1:3 | |
-XX:SurvivorRatio | Eden区与Survivor区的大小比值 | 默认为8:1,由于survivor有2个,所以单个survivor占整个新生代的1/5 | |
-XX:LargePageSizeInBytes | 内存页的大小不可设置过大, 会影响Perm的大小 =128m | ||
-XX:MaxTenuringThreshold | 垃圾最大年龄 | 对象在新生代中存活的最大年龄,超过该值会进入老年代 | |
-XX:PretenureSizeThreshold | 对象超过多大,直接在老年代分配 | 0个字节 | 新生代采用Parallel Scavenge GC时无效 |
垃圾收集器
参数 | 收集器名称 | 新生代/老年代 | 回收算法 | 简介 |
---|---|---|---|---|
-XX:+UseSerialGc | 串行收集器 | 新生代 | 复制 | 最早的新生代收集器,适合单cpu,单核cup使用,避免了多线程切换的开销 |
-XX:+UseParNewGc | 并行收集器 | 新生代 | 复制 | 并行收集器,采用了多线程并行收集,指定的线程数不要超过cpu核数,一般和CMS搭配使用 |
-XX:+UseParallelScavengeGc | 并行收集器 | 新生代 | 复制 | 并行收集器,该收集器优先考虑吞吐量,如果应用对stop the word 比较敏感的话,不建议采用。 |
-XX:+UseSerialOldGc | 串行收集器 | 老年代 | 标记整理 | 最早的老生代收集器串行收集器 |
-XX:+UseParallelOldGc | 并行收集器 | 老生代 | 标记整理 | 老年代并行收集器,一般和ParallelScavengeGc 搭配使用 |
-XX:+UseConcMarkSweepGC | 并发收集器 | 新生代 | 标记清除 | jdk史上第一款并发老年代器,回收算法采用标记清除算法,CMSGc分4步,1.初始标记 2 并发标记 3重新标记 4 并发清理。1和3都是需要STW的,但暂停时间非常短,大大减少了gc的暂停时间。缺点是容易产生内存碎片,可以配置压缩内存参数。是jdk 1.8比较主流的gc回收器 |
-XX:+UseG1GC | 并发收集器 | 新生代/老年代 | 标记整理 | G1回收器虽保留了新生代和老年代的概念,但是2者在物理空间上已经不再划分开了,G1把堆化分了一个一个的region,region按优先级回收,回收算法采用的是标记整理。标记的过程和CMS一样,只是不会再有内存碎片的问题,JD8后推荐G1回收器 |
其他GC相关参数
参数名称 | 含义 | 默认值 | 解释 |
---|---|---|---|
-XX:ParallelGCThreads=n | 并行收集器的线程数 | 同样适用于CMS | |
-XX:MaxGCPauseMillis = 时间 | 每次垃圾回收的最长时间(最大暂停时间) | 如果无法满足此时间,JVM会自动调整堆大小或者其他参数,以满足此值.该值如果过小,jvm可能会调减小堆的内存,可能会引起频繁的gc,降低吞吐量 | |
-XX:+UseAdaptiveSizePolicy | 设置此选项后,并行收集器会自动选择年轻代和老年代的比例,以达到目标系统规定的最低响应时间,吞吐量等 | ||
-XX:GCTimeRatio | 设置垃圾回收的时间占程序运行时间的百分比 | 默认为99 | 公式为1/(1+n),该值为吞吐量的倒数,例如 -XX:GCTimeRatio = 19表示,gc的时间占程序运行的总时间的5% |
-XX:+UseCMSCompactAtFullCollection | 在FULL GC的时候, 对年老代的压进行内存的压缩。会影响些性能,但是可以消除碎片,一般搭配CMSFullGCsBeforeCompaction使用 | ||
-XX:CMSFullGCsBeforeCompaction=次数 | 多少次fullgc后进行内存压缩,例如-XX:CMSFullGCsBeforeCompaction=3 表示3次内存压缩后执行内存压缩 | ||
-XX:+CMSParallelRemarkEnabled | 降低标记停顿 | ||
-XX:+UseCMSInitiatingOccupancyOnly | 使用手动定义初始化定义开始CMS收集 | 禁止hostspot自行触发CMS GC | |
-XX:CMSInitiatingOccupancyFraction | 老年代内存使用多少后开始CMS回收 | ||
-XX:ParallelCMSThreads | 设定CMS的线程数量 |
GC信息打印配置
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
#打印对象分布
-XX:+PrintTenuringDistribution
#对比下GC前后堆内存情况
-XX:+PrintHeapAtGC
#打印暂停时间
-XX:+PrintGCApplicationStoppedTime
# GC日志输出的文件路径
-Xloggc:/path/to/gc-%t.log
# 开启日志文件分割
-XX:+UseGCLogFileRotation
# 最多分割几个文件,超过之后从头开始写
-XX:NumberOfGCLogFiles=14
# 每个文件上限大小,超过就触发分割
-XX:GCLogFileSize=100M
总结
通常我们希望,gc时间短且次数少。但本就是一个相对的。
gc次数少,那就堆的空间肯定要大,堆大的话,单次gc持续的时间肯定会长些。必须要在此做出权衡
jvm调优的目的应该是尽量将对象驻留在新生代,减少fullgc的次数。