JVM调优备忘(1)

  从J2SE1.2开始,垃圾回收器都是使用了分代收集算法。原因在于:不同的对象的生命周期是不一样的。对不同生命周期的对象采取不同的收集方式,可以提高垃圾回收的效果。   

  虚拟机中的共划分为三个代:年轻代(Young Generation)、年老代(Old Generation)和持久代(Permanent Generation)。其中持久代主要存放的是Java类的类信息,与垃圾收集要收集的Java对象关系不大。年轻代和年老代的划分是对垃圾收集影响比较大的。

年轻代:

  所有新生成的对象首先都是放在年轻代的。年轻代的目标就是尽可能快速的收集掉那些生命周期短的对象。年轻代分三个区,一个Eden区,两个Survivor区(可以配置多于两个)。当Eden区满会触发Scavenge GC,此时如果还存活的对象,将被复制到其中一个Survivor区。当这个Survivor区满时,会把这个区存活的对象复制到另一个Survivor区,当这一个区也满了,那么这些存活的对象会被复制到年老区。

年老代:

  年老区存放着经过多次GC后仍存活的对象,都是一些生命周期较长的。

持久代:

  用于存放静态文件,如java类、方法之类的。持久代对GC基本上没有啥影响。可通过-XX:MaxPermSize=200m进行配置。

通常GC分为两种:Scavenge GC和Full GC。

  当Eden申请内存空间失败时,会触发Scavenge GC,对Eden区进行垃圾回收,将将对象移到Survivor区,同时整理整Survivor区。这个GC通常比较快速,性能较高。

  当年老代、持久待被写满了或者System.gc()被显示调用,则可能导致Full GC。Full GC会对整个堆进行整理包括了年轻代、年老代和持久代。因为Full GC比较慢,所以应当尽可能减少Full GC的次数。在调优的过程中,很大一部分时间是在对Full GC进行调整。

下面简单列举一些JVM的配置:

  -Xmx2048m:设置JVM最大可用内存为2048M。

  -Xms2048m:设置JVM内存为2048m。该值可以设置与最大可用内存相同,这样在每次垃圾回收完成后,JVM不需要重新分配内存。

  -Xmn1024m:设置年轻代的大小。

  -Xss128k:设置每个线程的堆栈大小。JDK5以后默认大小为1M,之前是256k。减小它可以生成更多的线程。

  -XX:NewRatio=4:设置年轻代与年老代的比值。设置4即年轻代占整堆的1/5。

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

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

  -XX:MaxTenuringThreshold=0:设置垃圾最大年龄。会多次在Survivor区复制。设置为0会跳过Suvivor区,直接移到年老区。

  -XX:+UseSerialGC:选择垃圾收集器为串行收集器。使用单线程去完成所有的gc工作,没有线程间的通信。

    GC名: Copy   MarkSweepCompact(FGC)

  -XX:+UseParallelGC:选择垃圾收集器为并行收集器。此配置仅对年轻代有效。即上述配置下,年轻代使用并发收集,而年老代仍旧使用串行收集。

    GC名:PS Scavenge         PS MarkSweep(FGC)

  -XX:ParallelGCThreads=20:配置并行收集器的线程数,即:同时多少个线程一起进行垃圾回收。此值最好配置与处理器数目相等。

  -XX:+UseParallelOldGC:配置年老代垃圾收集方式为并行收集。JDK6.0支持对年老代并行收集。

    GC名:PS Scavenge         PS MarkSweep(FGC)

  -XX:MaxGCPauseMillis=100:设置每次年轻代垃圾回收的最长时间,如果无法满足此时间,JVM会自动调整年轻代大小,以满足此值。

  -XX:+UseAdaptiveSizePolicy:设置此选项后,并行收集器会自动选择年轻代区大小和相应的Survivor区比例,以达到目标系统规定的最低相应时间或者收集频率等,此值建议使用并行收集器时,一直打开。

  -XX:+UseConcMarkSweepGC:设置年老代为并发收集。测试中配置这个以后,-XX:NewRatio=4的配置失效了,原因不明。所以,此时年轻代大小最好用-Xmn设置。 

     GC名:ParNew      ConcurrentMarkSweep(FGC)

  -XX:+UseParNewGC: 设置年轻代为并行收集。可与CMS收集同时使用。JDK5.0以上,JVM会根据系统配置自行设置,所以无需再设置此值。

  -XX:CMSFullGCsBeforeCompaction:由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此值设置运行多少次GC以后对内存空间进行压缩、整理。
  -XX:+UseCMSCompactAtFullCollection:打开对年老代的压缩。可能会影响性能,但是可以消除碎片

原文地址:https://www.cnblogs.com/zhangchaozheng/p/2586778.html