美文网首页
jvm调优重要参数

jvm调优重要参数

作者: 乔治m2 | 来源:发表于2020-06-11 11:00 被阅读0次

    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性能监控工具

    1. jps : 跟linux的ps一样,只不过是列出java程序

      jps -m  列出所有java程序,并显示传入参数 
      jps -l  列出所有java程序,显示类的全限名
      
    2. jstat :观察java程序运行时的相关信息,主要是堆信息

      jstat -class -t pid 1000 2  查看classLoader相关信息,每隔一秒执行一次,总共收集两次
      jstat -gc pid 查看gc情况
      jstat -gcnew pid  查看新生代的一些详细信息
      jstat -gcold pid  查看老年代的一些详细信息
      
    3. jinfo :查看java应用程序的扩展参数,部分参数可支持动态修改

      jinfo -flag MaxtenuringThreshold pid 查看gc升级年龄
      jinfo -flag +PrintGCDetails pid  修改使用PrintGCDetails参数
      
    4. jmap :导出堆到文件

      jmap -histo pid >c:\s.txt  java程序的对象统计信息
      jmap -dump:format=b file=c:\heap.hprof 得到java程序的当前快照
      
    5. jstack :查看线程堆栈

      jstack -l pid > c:\deadlock.txt 这里-l是打印锁的详细信息
      

    相关文章

      网友评论

          本文标题:jvm调优重要参数

          本文链接:https://www.haomeiwen.com/subject/aaovtktx.html