• 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:打开对年老代的压缩。可能会影响性能,但是可以消除碎片

  • 相关阅读:
    第二高的薪水
    leecode 删除排序数组中的重复项
    leecode 17. 电话号码的字母组合
    dubbo 限流之TpsLimitFilter
    G1总结
    leecode 3. 无重复字符的最长子串
    mysql是如何解决脏读、不可重复读、幻读?
    归并排序
    PostgreSQL管理数据库安全
    Oracle Database 19c 技术架构(三)
  • 原文地址:https://www.cnblogs.com/zhangchaozheng/p/2586778.html
Copyright © 2020-2023  润新知