JVM调优统计

转自:http://unixboy.iteye.com/blog/174173/

  1. 堆大小设置 JVM
    中最大堆大小有三地点限制:相关操作系统的数据模型(32-bt仍然64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。我在Windows
    Server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可安装为1478m。
    典型设置:

    • java -Xmx3550m -Xms3550m -Xmn2g -Xss128k
      -Xmx3550m:设置JVM最大可用内存为3550M。
      -Xms3550m:设置JVM促使内存为3550m。此值能够设置与-Xmx相同,以幸免每回垃圾回收落成后JVM重新分配内存。
      -Xmn2g:设置年轻代大小为2G。全方位JVM内存大小=年轻代大小 +
      年老代大小 +
      持久代大小
      。持久代一般固定大小为64m,所以增大年轻代后,将会减小年老代大小。此值对系统品质影响较大,Sun官方推荐配置为全方位堆的3/8。
      -Xss128k:设置每个线程的库房大小。JDK5.0事后种种线程堆栈大小为1M,以前每个线程堆栈大小为256K。更具应用的线程所需内存大小举办调整。在同样物理内存下,减小那些值能生成更加多的线程。然则操作系统对一个进程内的线程数仍然有限制的,不可以最好生成,经验值在3000~5000左右。
    • java -Xmx3550m -Xms3550m -Xss128k -XX:NewRatio=4
      -XX:SurvivorRatio=4 -XX:MaxPermSize=16m
      -XX:MaxTenuringThreshold=0

      -XX:NewRatio=4:设置年轻代(包涵艾登和多个SurOPPOr区)与年老代的比值(除去持久代)。设置为4,则后生代与年老代所占比率为1:4,年轻代占总体堆栈的1/5
      -XX:SurvivorRatio=4:设置年轻代中艾登区与Sur索爱r区的大小比值。设置为4,则多少个Sur摩托罗拉r区与一个Eden区的比率为2:4,一个SurNokiar区占总体年轻代的1/6
      -XX:MaxPermSize=16m:设置持久代大小为16m。
      -XX:MaxTenuringThreshold=0:设置垃圾最大年龄。即使设置为0的话,则年轻代目的不通过SuriPhoner区,直接进入年老代。对于年老代比较多的使用,可以升高功用。如若将此值设置为一个较大值,则年轻代目的会在Sur索爱r区进行数次复制,那样可以追加对象再年轻代的现有时间,扩大在青春代即被回收的概论。
  2. 回收器选拔 JVM给了三种选取:串行收集器、并行收集器、并发收集器,可是串行收集器只适用于小数据量的情事,所以那边的精选关键针对并行收集器和出现收集器。默许意况下,JDK5.0此前都是行使串行收集器,如若想使用其余收集器需要在启动时插足相应参数。JDK5.0事后,JVM会根据当下系统布局拓展判定。
    1. 吞吐量优先的并行收集器
      如上文所述,并行收集尊敬要以到达一定的吞吐量为对象,适用于科技和后台处理等。
      一流配置

      • java -Xmx3800m -Xms3800m -Xmn2g
        -Xss128k -XX:+UseParallelGC -XX:ParallelGCThreads=20
        -XX:+UseParallelGC:选取垃圾收集器为并行收集器。此计划仅对年轻代卓有成效。即上述配置下,年轻代选择并发收集,而年老代如故采取串行收集。
        -XX:ParallelGCThreads=20
        :配置并行收集器的线程数,即:同时有些个线程一起展开垃圾回收。此值最好安插与电脑数目相等。
      • java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC
        -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC
        -XX:+UseParallelOldGC
        :配置年老代垃圾收集格局为并行收集。JDK6.0接济对年老代互相收集。
      • java -Xmx3550m -Xms3550m -Xmn2g -Xss128k
        -XX:+UseParallelGC  -XX:MaxGCPauseMillis=100
        -XX:MaxGCPauseMillis=100:
        设置每一次年轻代垃圾回收的最长日子,假如不能满意此时间,JVM会自动调整年轻代大小,以满意此值。
      • java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseParallelGC 
        -XX:MaxGCPauseMillis=100 -XX:+UseAdaptiveSizePolicy
        -XX:+UseAdaptiveSizePolicy
        :设置此选项后,并行收集器会自动选拔年轻代区大小和对应的SurNokiar区比例,以达到目的系统确定的最低相应时间或者收集频率等,此值建议选择并行收集器时,平昔打开。
    2. 一呼百应时间优先的产出收集器
      科学技术,如上文所述,并发收集器首倘若保障系统的响应时间,裁减污染源收集时的中断时间。适用于应用服务器、电信领域等。
      顶尖配置

      • java -Xmx3550m -Xms3550m -Xmn2g -Xss128k
        -XX:ParallelGCThreads=20 -XX:+UseConcMarkSweepGC
        -XX:+UseParNewGC
        -XX:+UseConcMarkSweepGC
        :设置年老代为出现收集。测试中布置这么些未来,-XX:NewRatio=4的安排失效了,原因不明。所以,此时后生代大小最好用-Xmn设置。
        -XX:+UseParNewGC:设置年轻代为并行收集。可与CMS收集同时采纳。JDK5.0上述,JVM会按照系统布置活动设置,所以不必再安装此值。
      • java -Xmx3550m -Xms3550m -Xmn2g -Xss128k
        -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection
        -XX:CMSFullGCsBeforeCompaction:由于出现收集器不对内存空间举行压缩、整理,所以运行一段时间将来会生出“碎片”,使得运行功用下落。此值设置运行多少次GC将来对内存空间开展压缩、整理。
        -XX:+UseCMSCompactAtFullCollection:打开对年老代的缩减。可能会影响属性,不过可以防除碎片
  3. 援救信息 JVM提供了多量命令行参数,打印音讯,供调试使用。紧要有以下一些:

    • -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 -XX:+PrintGC:PrintGC提姆eStamps可与地方多个混合使用
      出口格局:11.851: [GC 98328K->93620K(130112K), 0.0082960
      secs]

    • -XX:+PrintGCApplicationConcurrentTime:打印每一回垃圾回收前,程序未中止的实践时间。可与地方混合使用
      输出格局:Application time: 0.5291524 seconds
    • -XX:+PrintGCApplicationStoppedTime:打印垃圾回收期间先后暂停的岁月。可与地点混合使用
      出口方式:Total time for which application threads were
      stopped: 0.0468229 seconds
    • -XX:PrintHeapAtGC:打印GC前后的详尽堆栈音信
      输出方式:
      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)
       tenured generation   total 69632K, used 2696K [0x227d0000,
      0x26bd0000, 0x26bd0000)
      the space 69632K,   3% used [0x227d0000, 0x22a720f8,
      0x22a72200, 0x26bd0000)
       compacting perm gen  total 8192K, used 2898K [0x26bd0000,
      0x273d0000, 0x2abd0000)
         the space 8192K,  35% used [0x26bd0000, 0x26ea4ba8,
      0x26ea4c00, 0x273d0000)
          ro space 8192K,  66% used [0x2abd0000, 0x2b12bcc0,
      0x2b12be00, 0x2b3d0000)
          rw space 12288K,  46% used [0x2b3d0000, 0x2b972060,
      0x2b972200, 0x2bfd0000)
      34.735: [DefNew: 52568K->3433K(55296K), 0.0072126 secs]
      55264K->6615K(124928K)Heap after gc invocations=8:  def new generation   total 55296K, used 3433K [0x1ebd0000,
      0x227d0000, 0x227d0000)
      eden space 49152K,   0% used [0x1ebd0000, 0x1ebd0000,
      0x21bd0000)
        from space 6144K,  55% used [0x21bd0000, 0x21f2a5e8,
      0x221d0000)
        to   space 6144K,   0% used [0x221d0000, 0x221d0000,
      0x227d0000)
       tenured generation   total 69632K, used 3182K [0x227d0000,
      0x26bd0000, 0x26bd0000)
      the space 69632K,   4% used [0x227d0000, 0x22aeb958,
      0x22aeba00, 0x26bd0000)
       compacting perm gen  total 8192K, used 2898K [0x26bd0000,
      0x273d0000, 0x2abd0000)
         the space 8192K,  35% used [0x26bd0000, 0x26ea4ba8,
      0x26ea4c00, 0x273d0000)
          ro space 8192K,  66% used [0x2abd0000, 0x2b12bcc0,
      0x2b12be00, 0x2b3d0000)
          rw space 12288K,  46% used [0x2b3d0000, 0x2b972060,
      0x2b972200, 0x2bfd0000)
      }
      , 0.0757599 secs]
    • -Xloggc:filename:与地方多少个杰出使用,把有关日志信息记录到文件以便分析。
  4. 周边配置汇总

    1. 堆设置
      • -Xms:初步堆大小
      • -Xmx:最大堆大小
      • -XX:NewSize=n:设置年轻代大小
      • -XX:NewRatio=n:安装年轻代和年老代的比率。如:为3,表示年轻代与年老代比值为1:3,年轻代占整体青春代年老代和的1/4
      • -XX:SurvivorRatio=n:年轻代中艾登区与七个Sur中兴r区的比值。注意Sur酷派r区有七个。如:3,表示艾登:Sur三星r=3:2,一个SurOne plusr区占所有年轻代的1/5
      • -XX:MaxPermSize=n:设置持久代大小
    2. 收集器设置
      • -XX:+UseSerialGC:设置串行收集器
      • -XX:+UseParallelGC:设置并行收集器
      • -XX:+UseParalledlOldGC:设置并行年老代收集器
      • -XX:+UseConcMarkSweepGC:设置并发收集器
    3. 污染源回收统计音信
      • -XX:+PrintGC
      • -XX:+PrintGCDetails
      • -XX:+PrintGCTimeStamps
      • -Xloggc:filename
    4. 交互收集器设置
      • -XX:ParallelGCThreads=n:设置并行收集器收集时使用的CPU数。并行收集线程数。
      • -XX:MaxGCPauseMillis=n:设置并行收集最大暂停时间
      • -XX:GCTimeRatio=n:设置垃圾回收时间占程序运行时间的比重。公式为1/(1+n)
    5. 并发收集器设置
      • -XX:+CMSIncrementalMode:设置为增量格局。适用于单CPU情形。
      • -XX:ParallelGCThreads=n:设置并发收集器年轻代收集格局为并行收集时,使用的CPU数。并行收集线程数。

四、调优总计

  1. 青春代大小选拔
    • 一呼百应时间优先的接纳尽心尽力设大,直到接近系统的最低响应时间限制(根据实际景况选用)。在此种情况下,年轻代收集发出的频率也是纤维的。同时,裁减到达年老代的靶子。
    • 吞吐量优先的运用:尽可能的装置大,可能到达Gbit的水平。因为对响应时间从没必要,垃圾收集可以相互举行,一般适合8CPU以上的利用。
  2. 年老代高低接纳

    • 一呼百应时间先行的行使:年老代选拔并发收集器,所以其尺寸须求小心设置,一般要考虑并发会话率会话持续时间等一些参数。倘使堆设置小了,能够会导致内存碎片、高回收频率以及使用暂停而利用传统的号子清除格局;假设堆大了,则要求较长的募集时间。最优化的方案,一般必要参考以下数据拿到:

      • 出现垃圾收集音讯
      • 慎始而敬终代并发收集次数
      • 传统GC信息
      • 花在年轻代和年老代回收上的日子比例

      减二零一八年轻代和年老代开支的时光,一般会增高使用的成效

    • 吞吐量优先的选用:一般吞吐量优先的利用都有一个很大的年轻代和一个较小的年老代。原因是,那样可以尽量回收掉一大半长时间目的,收缩先前时期的目的,而年老代尽存放长时间并存对象。
  3. 较小堆引起的散装难点 因为年老代的产出收集器使用标志、清除算法,所以不会对堆举办压缩。当收集器回收时,他会把相邻的上空拓展合并,那样能够分配给较大的目的。可是,当堆空间较时辰,运行一段时间未来,就会现出“碎片”,假使并发收集器找不到丰富的空中,那么并发收集器将会告一段落,然后利用传统的号子、清除格局展开回收。假若现身“碎片”,可能必要举行如下配置:
    • -XX:+UseCMSCompactAtFullCollection:使用并发收集器时,开启对年老代的压缩。
    • -XX:CMSFullGCsBeforeCompaction=0:上边配置开启的景观下,那里安装有些次Full
      GC后,对年老代进展削减

Leave a Comment.