GC 指令

查看Java8默认GC策略

  1. java -XX:+PrintCommandLineFlags -versionjava

  2. jinfo -flags PID 查看 “Non-default VM flags:” 中的信息
    算法

发现:
默认下是 -XX:+UseParallelGC : 新生代并发收集,老年代串行收集。多线程

指令

新生代(别名) 老年代 JVM 参数
Serial (DefNew) Serial Old(PSOldGen) -XX:+UseSerialGC
Parallel Scavenge (PSYoungGen) Serial Old(PSOldGen) -XX:+UseParallelGC
Parallel Scavenge (PSYoungGen) Parallel Old (ParOldGen) -XX:+UseParallelOldGC
ParNew (ParNew) Serial Old(PSOldGen) -XX:-UseParNewGC
ParNew (ParNew) CMS(PSOldGen) -XX:+UseConcMarkSweepGC
G1 G1 -XX:+UseG1GC

典型配置

  •  -XX:+UseSerialGC: 
    新生代,老年代都使用串行回收收集器。新生代使用复制算法,老年代使用标记-整理算法。使用一个线程进行GC,串行,其它工做线程暂停。
    Jvm运行在Client模式下的默认值,使用Serial + Serial Old的收集器组合进行内存回收
  • -XX:+UseParNewGC:  
    新生代进行并行回收,老年代仍旧使用串行回收。默认关闭。Serial收集器的多线程版,用多个线程进行并行GC,其它工做线程暂停。(操做系统是多核CPU上效果明显,单核CPU建议使用串行回收器。)打印GC详情时ParNew标识着使用了ParNewGC回收器。
    [GC[ParNew: 78656K->8703K(78656K), 0.0180555 secs] 81048K->17429K(253440K), 0.0187828 secs] [Times: user=0.03 sys=0.00, real=0.02 secs]
  • -XX:+UseParallelGC
    吞吐量优先的并发垃圾回收器,做用在新生代,使用复制算法。 关注CPU吞吐量,即运行用户代码的时间 /(运行用户代码时间+垃圾收集时间)。
    Jvm运行在Server模式下的默认值,使用Parallel Scavenge +  Serial Old的收集器组合进行回收
  • -XX:+UseParallelOldGC: 
    使用Parallel Scavenge +  Parallel Old的收集器组合进行回收 ,默认是使用单线程。打印出的GC会带PSYoungGen、ParOldGen关键字。
    [Full GC [PSYoungGen: 4032K->0K(145920K)] [ParOldGen: 164500K->138362K(246272K)] 168532K->138362K(392192K) [PSPermGen: 67896K->67879K(136192K)], 1.006
    • -XX:ParallelGCThreads=<N>:
      设置并发垃圾回收的线程数。可设置与机器处理器数量相等。 该参数jvm会默认设置成online的cpu的核数但并不包括被shutdown的cpu的核数
    • -XX:MaxGCPauseMillis=<N>: 
      指定垃圾回收时的最长暂停时间,它的参数运行值是一个大于0的毫秒数。收集器将尽力保证垃圾回收时间不超过设定值,系统运行的须要回收的垃圾总量是固定的,缩短停顿时间的同时会增大回收频度。
    • -XX:GCTimeRatio=<N>: 
      吞吐量为垃圾回收时间与非垃圾回收时间的比值,它运行的参数值是0-100的整数。公式为1/(1+N)。eg: -XX:GCTimeRatio=19时,表示5%(1/(1+19))的时间用于垃圾回收。默认状况为99,即1%的时间用于垃圾回收。
    • -XX:UseAdaptiveSizePolicy: 
      自适应的调节策略。JVM会根据实际运行状况动态调整新生代大小、新生代和s区比例、晋升老年代对象大小等细节参数。
      (JDK 1.8 默认使用 UseParallelGC 垃圾回收器,该垃圾回收器默认启用该配置。由 AdaptiveSizePolicy 引起的 GC 问题
  • -Xms:
    表示java虚拟机堆区内存初始内存分配的大小。
  • -Xmx:
    表示java虚拟机堆区内存可被分配的最大上限 (开发过程当中,一般会将-Xms 与-Xmx两个参数的配置相同的值,其目的是为了可以在java垃圾回收机制清理完堆区后不须要从新分隔计算堆区的大小而浪费资源
  • -XX:newSize:
    表示新生代初始内存的大小,应该小于-Xms的值;
  • -XX:MaxNewSize:
    表示新生代可被分配的内存的最大上限;固然这个值应该小于-Xmx的值;
  • -Xmn:
    这个参数则是对 -XX:newSize、-XX:MaxnewSize两个参数的同时配置,
    也就是说: 若是经过-Xmn来配置新生代的内存大小,那么-XX:newSize = -XX:MaxnewSize = -Xmn,虽然会很方便,但须要注意的是这个参数是在JDK1.4版本之后才使用的。
  • -Xss:
    为jvm启动的每一个线程分配的内存大小,
  • -XX:MetaspaceSize:
    class metadata的初始空间配额,以bytes为单位,达到该值就会触发垃圾收集进行类型卸载,同时GC会对该值进行调整:若是释放了大量的空间,就适当的下降该值;若是释放了不多的空间,那么在不超过MaxMetaspaceSize(若是设置了的话),适当的提升该值。
  • -XX:MaxMetaspaceSize:
    能够为class metadata分配的最大空间。默认是没有限制的。
  • -XX:MinMetaspaceFreeRatio:
    在GC以后,最小的Metaspace剩余空间容量的百分比,减小为class metadata分配空间致使的垃圾收集
  • -XX:MaxMetaspaceFreeRatio:
    在GC以后,最大的Metaspace剩余空间容量的百分比,减小为class metadata释放空间致使的垃圾收集
  • -XX:+PrintTenuringDistribution: 
    用于显示每次Minor GC时Survivor区中各个年龄段的对象的大小
  • -XX:InitialTenuringThreshol和-XX:MaxTenuringThreshold: 
    用于设置晋升到老年代的对象年龄的最小值和最大值,每一个对象在坚持过一次Minor GC以后,年龄就加1。
  • -XX:PreternureSizeThreshold
    直接晋升老年代的对象大小,设置了这个参数后,大于这个参数的对象直接在老年代进行分配
  • -XX:+HandlePromotionFailure :
    是否容许新生代收集担保,进行一次minor gc后, 另外一块Survivor空间不足时,将直接会在老年代中保留。
  • -XX:+DisableExplicitGC :
    关闭手动System.gc()
  • -XX:+UseFastaccessorMethods :
    原始类型优化并发

垃圾回收统计信息

  • -XX:+PrintGC
    [GC 118250K->113543K(130112K), 0.0094143 secs] 
    [Full GC 121376K->10414K(130112K), 0.0650971 secs]
  • -XX:+PrintGCDetails
    [GC [DefNew: 8614K->781K(9088K), 0.0123035 secs] 118250K->113543K(130112K), 0.0124633 secs]
    [GC [DefNew: 8614K->8614K(9088K), 0.0000665 secs][Tenured: 112761K->10414K(121024K), 0.0433488 secs] 121376K->10414K(130112K), 0.0436268 secs]
  • -XX:+PrintGCTimeStamps 与上两命令合用
    11.851: [GC 98328K->93620K(130112K), 0.0082960 secs]
  • -XX:+PrintGCApplicationConcurrentTime 打印每次垃圾回收前,程序未中断的执行时间。可与上面混合使用
    Application time: 0.5291524 seconds
  • -XX:+PrintGCApplicationStoppedTime 打印垃圾回收期间程序暂停的时间。可与上面混合使用app

    Total time for which application threads were stopped: 0.0468229 seconds
  • -XX:PrintHeapAtGC 打印GC先后的详细堆栈信息jvm

    34.702: [GC {Heap before gc invocations=7:
    def new generation   total 55296K, used 52568K [0x1ebd0000, 0x227d0000, 0x227d0000)
    eden space 49152K, 99% used [0x1ebd0000, 0x21bce430, 0x21bd0000)
    from space 6144K, 55% used [0x221d0000, 0x22527e10, 0x227d0000)
    to   space 6144K,   0% used [0x21bd0000, 0x21bd0000, 0x221d0000)
    ...
  • -Xloggc:filename  指定log输出文件性能

eg优化

java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0

-Xmx3550m:设置JVM最大可用内存为3550M。spa

-Xms3550m:设置JVM初始内存为3550m。此值能够设置与-Xmx相同,以免每次垃圾回收完成后JVM从新分配内存操作系统

-Xmn2g:设置年轻代大小为2G。整个堆大小= 年轻代大小 + 年老代大小 + 持久代大小。持久代通常固定大小为64m,因此增大年轻代后,将会减少年老代大小。此值对系统性能影响较大,Sun官方推荐配置为整个堆的3/8。

-Xss128k:设置每一个线程的堆栈大小。JDK5.0之后每一个线程堆栈大小为1M,之前每一个线程堆栈大小为256K。更具应用的线程所需内存大小进行调整。在相同物理内存下,减少这个值能生成更多的线程。可是操做系统对一个进程内的线程数仍是有限制的,不能无限生成,经验值在3000~5000左右。

-XX:NewRatio=4: 设置年轻代(包括Eden和两个Survivor区)与年老代的比值(除去持久代)。设置为4,则年轻代与年老代所占比值为1:4,年轻代占整个堆栈的1/5

-XX:SurvivorRatio=4:设置年轻代中Eden区与Survivor区的大小比值。设置为4,则两个Survivor区与一个Eden区的比值为2:4,一个Survivor区占整个年轻代的1/6

-XX:MaxPermSize=16m:设置持久代大小为16m。

-XX:MaxTenuringThreshold=0:设置垃圾最大年龄。若是设置为0的话,则年轻代对象不通过Survivor区,直接进入年老代。对于年老代比较多的应用,能够提升效率。若是将此值设置为一个较大值,则年轻代对象会在Survivor区进行屡次复制,这样能够增长对象再年轻代的存活时间,增长在年轻代即被回收的概论。

相关文章
相关标签/搜索