JVM 调优

 一  性能调优的目的:

  满足程序的  高吞吐量,  低延迟/高响应 实际上垃圾收集器中吞吐量和低延迟这两个目标其实是存在相互竞争的矛盾,没有任何一种调优方案是适用于所有应用场景

 

 

二 性能调优的基本原则

  首先是尽可能的让GC发生在新生代中,多执行Minor GC 少触发Full GC 的频率

       其次 GC所持有的可用内存越大(Heap所占用的堆内存越大) GC的执行效率越好,目的是达到回收阈值就越不容易。

     Heap 初始大小分配 在生产环境中 根据多次迭代后观察Full GC的数据信息来估算来给出初始大小 比如Full GC 如果老年代中的活跃数据占用内存大小为100M,那么按照通用计算法则,可以按照约3-4倍来分配堆大小 -Xms   -Xmx

  新生代和老年代的比例官方建议按照整个堆的3/8来进行分配 -Xmn可以占整个堆内存空间的3/8

      永久代则根据Full GC后产生的数据信息,根据永久代活跃数据占用内存大小的1.5倍  

  建议 -Xms -Xmx 设定为同一值  永久代同理 

三 新生代的性能调优

  极其注重吞吐量和高响应的应用场景下,并行回收有着串行回收无法比拟的绝对优势。堆空间大部分对象都是瞬时对象,生命周期很短 所以这些往往都用 新生代 进行控制

 

  首先是测量出Minor GC的执行平率和持续时间是否满足需求,以及-XX:ParallelGCThreads选项的配置。如图A-1所示:

笔者带你剖析大规模分布式Java平台JVM性能调优

 

  如果说Minor GC执行的太频繁,那么必然是-Xmn分配得过小,反之Minor GC很久才执行一次,而每次执行的周期较长,则意味着-Xmn分配得过大。

  我们需要多次迭代,从最初将-Xmn的值设置到最低,然后逐步微调,慢慢的你会发现Minor GC的执行频率在降低,直到最终满足需求即可停止。

  经过这样的调试,你会发现程序的吞吐量上来了,但是每次执行Minor GC的周期会变得较长,怎么办呢?

  我们可以通过-XX:ParallelGCThreads选项调整GC执行的线程数,让更多的GC线程执行垃圾收集,提升GC的回收效率。基本可以满足降低GC的回收平率,提升GC的回收效率。

  由于使用的是并行GC,我们可以充分利用多核CPU资源以及线程资源。同微调-Xmn选项一样,我们首先可以将-XX:ParallelGCThreads设置为物理CPU核心数的1/2,

  比如你的CPU是6核,那么-XX:ParallelGCThreads的值就可以设置为3(最好不要小于2,否则将会影响并行GC的回收效率),这样一来,CPU可用资源就会将一半分配给GC线程使用,

  而剩下的CPU资源则服务于应用线程中。当然如果你的项目并不重视高响应,-XX:ParallelGCThreads的值可以相对的进行减少,以便于有更多的CPU资源分配给程序中的工作线程。

 

性能监控工具  java visualVM  默认没有添加GC 去工具里找到下来添加进来即可

 eclipse 调优 思路分析GC /FULL GC

  

  收集算法:

  •  标记算计 复制算法  标记整理  分代收集算法

  垃圾收集器

   Serial 串行收集器 面向新生代

   ParNew  并行收集器 新生代

   Parallel scavenge:并行收集器 新生代

      SerialOld 老年代

      Paraller old

           CMS concurrent Mark Sweep 并发标记整理

       现在一般 使用

    CMS + Serial/ParNew 

              SerialOld + Serial/Paraller scavenge

    Paraller old + Parallel scavenge

    三种组合 具体情况根据应用来看

   

  

 

 

    

posted @ 2018-05-28 17:56  染指丶红莲  阅读(123)  评论(0)    收藏  举报