jvm调优重要参数
规范:在-XX: -X, -XX:+X 这里冒号后面的加号或者减号是启动和禁止的意思
栈空间参数设置
-Xss: 设置线程的最大栈空间,栈空间越大,方法的递归深度越大
方法区参数设置
方法区大小的参数设置跟jdk版本相关
方法区越大,保存的类越多
# jdk1.6,jdk1.7设置方法区永久代的大小
-XX:PermSize=5M
-XX:MaxPermSize=5M 最大永久代的大小默认是64M
# jdk1.8及以上,永久代被移除,取而代之的是元数据区,元数据区是一块堆外的直接内存,如果不指定大小,那么会耗尽所有可用的系统内存
-XX:MaxMetaspaceSize=60M 设置最大元数据的大小
堆设置
-Xms:初始堆大小
-Xmx:最大堆大小
-Xmn:设置新生代大小,设置较大的新生代大小会减小老年代大小,新生代的大小一般为堆空间的1/3,1/4
-XX:NewSize=n:设置年轻代大小
-XX:NewRatio=n:设置年轻代和年老代的比值(老年代/新生代)。如:为3,表示年轻代与年老代比值为1:3,年轻代占整个年轻代年老代和的1/4
-XX:SurvivorRatio=n:年轻代中Eden区与两个Survivor区的比值。注意Survivor区有两个。如:3,表示Eden:Survivor=3:2,
一个Survivor区占整个年轻代的1/5
堆溢出处理
下面两个参数配合使用,当系统发生堆空间不足时,会导出整个堆的信息,且导出到指定的文件中去,后面用MAT工具分析
-XX:HeapDumpOnOutOfMemoryError
-XX:HeapDumpPath=d:/a.dump
直接内存配置
如果频繁申请内存空间,则不适合使用直接内存分配
-XX:MaxDirectMemorySize 设置直接内存大小,如果不设置,默认值为最大堆空间,即-Xmx指定的大小,当达到指定值时,会触发垃圾回收,如果回收后也无法释放空间,那么将会抛出OOM
收集器设置
串行回收器Serial
-XX:+UseSerialGC:新生代,老年代都使用串行收集器
-XX:+UseParNewGC:新生代使用ParNew收集器,老年代使用串行收集器Serial(jdk9,10已经废除,因为ParNew只能和CMS收集器配合使用,而jdk9,10使用的默认收集器是G1)
-XX:+UseParallelGC:新生代使用ParallelGC,老年代使用串行收集器Serial
并行回收器ParNew
-XX:+UseParNewGC: 新生代使用ParNew收集器,老年代使用串行收集器Serial
-XX:+UseConcMarkSweepGC:新生代使用ParNew回收器,老年代使用CMS
# 指定ParNew回收器工作时回收线程的数量
-XX:ParallelGCThreads=n
一般n最好与cpu数量相当,当cpu数量小于8时,n的值等于cpu的数量,当cpu的数量大于8的时候,n=3+(5*cpu的数量)/8
并行回收器Parallel
-XX:+UseParallelGC:新生代使用ParallelGC回收器,老年代使用串行回收器Serial
-XX:+UseParallelOldGC:新生代使用ParallelGC回收器,老年代使用ParallelOldGc回收器
# 两个重要参数
-XX:MaxGCPasuseMillis:设置最大垃圾回收停顿时间,设置的过小,可能导致垃圾回收频率加大
-XX:GCTimeRatio:设置吞吐量大小,取值范围为0-100,系统回收垃圾的停顿时间花费不超过1/(1+n)%
# 设置线程数量
-XX:ParallelGCThreads
并行回收器CMS
-XX:+UseConcMarkSweepGC:新生代使用ParNew回收器,老年代使用CMS
CMS默认启动的并发线程数量为(parallelGCTheads+3)/4
# 设置并发线程数
-XX:ConcGCThreads=n
-XX:ParallelGCThreads=n
# 设置老年代空间使用率达到多少时执行CMS垃圾回收
-XX:CMSInitiatingOccupancyFraction 默认值为68
# 碎片整理参数,如果碎片不整理,可能造成没达到阈值就会触发老年代垃圾回收
-XX:+UseCMSCompactAtFullCollection :在CMS垃圾收集完成之后,进行一次内存碎片整理
-XX:+CMSFullGCsBeforeCompaction=n :在n次CMS回收后进行一次内存碎片整理
# 使用CMS回收方法去的perm区,默认情况下,还需要触发一次FullGC
-XX:+CMSClassUnloadingEnabled
并发收集器G1
-XX:UseG1GC 开启G1垃圾收集器
# 两个重要的参数
-XX:MaxGcPasuseMillis :指定目标最大停顿时间,如果停顿的时间过小,一次收集的区域数量也会变小,就会增加FullGC的可能
-XX:parallelGCThreads :设置并行回收的GC线程数量
-XX:InitiatingHeapOccupancyPercent :设置整个堆使用率达到多少时,触发并发标记的执行,默认是45
垃圾回收统计信息
-XX:+PrintGC 在程序运行期间,只要遇到GC,就会打印GC情况,占用大小->gc后大小, gc时间
jdk9,jdk10默认使用G1收集器,所以打印GC参数不同
-Xlog:gc
-XX:+PrintGCDetails 打印GC详细信息(JDK8,9,10建议使用-Xlog:gc*)
-XX:+PrintGCTimeStamps 分析GC发生的时间
-XX:+PrintGCApplicationConcurrentTime 打印应用程序的执行时间
-XX:+PrintGCApplicationStoppedTime 打印GC产生停顿的时间
-Xloggc:log/gc.log 让gc日志打印在log文件夹下的gc文件中,因为默认情况下gc日志在控制台输出
其他设置
栈上分配技术
允许对象直接在栈上进行分配,随线程停止而销毁,这样做可以加快分配速度,减少GC次数,栈空间较小,所以不适合大对象的栈上分配
# 开启栈上分配
-XX:+DoEscapeAnalysis 启用逃逸分析
-XX:+EliminateAllocations 开启标量替换(默认打开),允许对象打散分配在栈上,比如对象拥有id和name两个字段,那么这两个字段将会被视为两个独立的变量进行分配。
虚拟机的工作模式
两个模式:server,client
server模式启动慢,但是系统进入稳定期后,执行速度要远远快于client模式
-server 进入server模式
-client 进入client模式
对象晋升
-MaxTenuringThreshold=n ,当对象经历了多少次GC次数后进入老年代
# 大对象直接晋升到老年代
-PretenureSizeThreshold=n , 这里的单位是字节,新生对象大于这个值的时候,会直接分配到老年代
java性能监控工具
-
jps : 跟linux的ps一样,只不过是列出java程序
jps -m 列出所有java程序,并显示传入参数 jps -l 列出所有java程序,显示类的全限名
-
jstat :观察java程序运行时的相关信息,主要是堆信息
jstat -class -t pid 1000 2 查看classLoader相关信息,每隔一秒执行一次,总共收集两次 jstat -gc pid 查看gc情况 jstat -gcnew pid 查看新生代的一些详细信息 jstat -gcold pid 查看老年代的一些详细信息
-
jinfo :查看java应用程序的扩展参数,部分参数可支持动态修改
jinfo -flag MaxtenuringThreshold pid 查看gc升级年龄 jinfo -flag +PrintGCDetails pid 修改使用PrintGCDetails参数
-
jmap :导出堆到文件
jmap -histo pid >c:\s.txt java程序的对象统计信息 jmap -dump:format=b file=c:\heap.hprof 得到java程序的当前快照
-
jstack :查看线程堆栈
jstack -l pid > c:\deadlock.txt 这里-l是打印锁的详细信息
网友评论