JVM性能调优(二)

来源:互联网 发布:网络投票刷票器 编辑:程序博客网 时间:2024/05/22 15:26

上篇了解完JVM的具体构造和基本的垃圾回收机制后,接下来会操作JVM的性能调优。


1、堆大小设置

    JVM堆大小取决于操作系统,最大可以完全占据系统内存。

    Java -Xmx 2048m -Xms 2048m -Xmn 2g -Xss 128K

   -Xmx 2048m :最大堆设置2048M

  -Xms 2048m:最小堆设置2048M,通常最大最小堆设置一样,避免JVM回收后还需要分配堆内存。

  -Xmn 2g:设置新生代大小

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

2、设置新生代比例,设置年老代大小

   Java -XX:NewRatio=4 -XX:SurvivorRatio=4 -XX:MaxPermSize=16m -XX:MaxTenuringThreshold=0

   -XX:NewRatio=4,表示年轻代:年老代=1:4

   -XX:SurvivorRatio=4,表示年轻代中Eden区与Survivor区的大小比值,两个Survivor区与一个Eden区的比值为2:4

   -XX:MaxPermSize=16m,设置年老代大小为16M,一般此值固定

   -XX:MaxTenuringThreshold=0,设置垃圾最大年龄。如果设置为0,表示年轻代对象不经过Survivor区直接接入年老代。对于年老代比较多的应用,可以提高效率。如果将此值设置为一个较大值,则年轻代对象会在Survivor区进行多次复制,这样可以增加对象在年轻代的存活时间,增加在年轻代被回收的概率。

3、回收器的选择

   吐吞量优先,选择并行收集器

   java -XX:+UseParallelGC -XX:ParallelGCThreads=20 -XX:+UseParallelOldGC -XX:MaxGCPauseMillis=100 -XX:+UseAdaptiveSizePolicy

    -XX:+UseParallelGC,表示年轻代使用并行收集器

   -XX:ParallelGCThreads=20,配置并行收集器的线程数为20

  -XX:+UseParallelOldGC,年老代配置收集器为并行收集器,JDK1.6以后支持年老代收集器配置

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

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

      响应时间优先,选择并发收集器

   Java -XX:+UseConcMarkSweepGC -XX:+UseParNewGC

   -XX:+UseConcMarkSweepGC,设置年老代为并发收集器,

     -XX:+UseParNewGC,年轻代为并行收集器

   java -Xmx3550m -Xms3550m -Xmn2g -Xss128k -XX:+UseConcMarkSweepGC -XX:CMSFullGCsBeforeCompaction=5 -XX:+UseCMSCompactAtFullCollection

   因为并行收集器不会堆内存空间进行压缩、整理,运行一段时间后会产生垃圾碎片,此值设置运行多少次GC以后对内存空间进行压缩、整理。

4、打印JVM GC运行信息

  -XX:+PrintGC,打印GC信息

    -XX:+PrintGCDetails,打印GC详细信息

  -XX:+PrintGCTimeStamps,

  -XX:+PrintGCApplicationConcurrentTime:打印每次垃圾回收前,程序未中断的执行时间。

  -XX:+PrintGCApplicationStoppedTime:打印垃圾回收期间程序暂停的时间。

  -XX:PrintHeapAtGC:打印GC前后的详细堆栈信息。

  -Xloggc:filename:与上面几个配合使用,把相关日志信息记录到文件以便分析。

5、调优总结

    吞吐量优先:年轻代尽量大,年老代小,这样可以减少到达年老代的对象的数量,尽可能回收掉大部分短期对象,减少中期的对象,而年老代尽存放长期存活对象。

    响应时间优先:年轻代尽量设大,减少年轻代垃圾回收的频率,减少年轻代对象到达年老代的数量。年老代设置为并发收集器,如果设置过小,垃圾挥手的频率变高,碎片较多;如果设置过大,垃圾回收的时间变长。


    

    

0 0