深入理解jvm(二)

上篇中了解完JVM的内存结构,对象的内存分配和垃圾回收后,本篇主要基于JVM的内存参数调优:

一、jvm参数调优

  在JVM启动参数中,可以设置跟内存、垃圾回收相关的一些参数设置。通过设置我们希望达到一些目标:

  • GC的时间足够的小
  • GC的次数足够的少
  • 发生Full GC的周期足够的长

  GC时间和GC次数调优是相悖的,要想GC时间小必须要一个更小的堆,要保证GC次数足够少,必须保证一个更大的堆,我们只能取 其平衡

1)针对JVM堆的设置,一般可以通过-Xms -Xmx限定其最小、最大值,为了防止垃圾收集器在最小、最大之间收缩堆而产生额外的时间,我们通常把最大、最小设置为相同的值。

2)年轻代和年老代将根据默认的比例(1:2)分配堆内存,可以通过调整二者之间的比率NewRadio来调整二者之间的大小,也可以针对回收代,比如年轻代,通过 -XX:newSize -XX:MaxNewSize来设置其绝对大小。同样,为了防止年轻代的堆收缩,我们通常会把-XX:newSize -XX:MaxNewSize设置为同样大小。

3)在配置较好的机器上(比如多核、大内存),可以为年老代选择并行收集算法。

4)线程堆栈的设置:每个线程默认会开启1M的堆栈,用于存放栈帧、调用参数、局部变量等,对大多数应用而言这个默认值太了,一般256K就足用。理论上,在内存不变的情况下,减少每个线程的堆栈,可以产生更多的线程,但这实际上还受限于操作系统。

二、JVM参数调优方法

 

2.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.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区进行多次复制,这样可以增加对象在年轻代的存活时间,增加在年轻代被回收的概率。

2.3 回收器的选择

   1)吐吞量优先,选择并行收集器: 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区比例,以达到目标系统规定的最低响应时间或者收集频率等,此值建议使用并行收集器时,一直打开。

   2)响应时间优先,选择并发收集器Java -XX:+UseConcMarkSweepGC -XX:+UseParNewGC

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

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

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

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

2.4 打印JVM GC运行信息

  -XX:+PrintGC,打印GC信息

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

  -XX:+PrintGCTimeStamps,

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

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

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

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

2.5 调优总结

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

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

 

    

    

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值