你对JVM调优是否熟悉这里向大家描述一下首先要了解几个概念比如说Perm持久代用于存放静态文件如今Java类方法等持久代对垃圾回收没有显着影响但是有些应用可能动态生成或者调用一些class例如Hibernate等 JVM调优总结 Young(年轻代) 年轻代分三个区一个Eden区两个Survivor区大部分对象在Eden区中生成当Eden区满时还存活的对象将被复制到Survivor区(两个中的一个)当这个Survivor区满时此区的存活对象将被复制到另外一个Survivor区当这个Survivor去也满了的时候从第一个Survivor区复制过来的并且此时还存活的对象将被复制年老区(Tenured)需要注意Survivor的两个区是对称的没先后关系所以同一个区中可能同时存在从Eden复制过来对象和从前一个Survivor复制过来的对象而复制到年老区的只有从第一个Survivor去过来的对象而且Survivor区总有一个是空的 Tenured(年老代) 年老代存放从年轻代存活的对象一般来说年老代存放的都是生命期较长的对象 Perm(持久代) 用于存放静态文件如今Java类方法等持久代对垃圾回收没有显着影响但是有些应用可能动态生成或者调用一些class例如Hibernate等在这种时候需要设置一个比较大的持久代空间来存放这些运行过程中新增的类持久代大小通过XX:MaxPermSize=<N>进行设置 JVM调优之年轻代大小选择 ◆响应时间优先的应用尽可能设大直到接近系统的最低响应时间限制(根据实际情况选择)在此种情况下年轻代收集发生的频率也是最小的同时减少到达年老代的对象 ◆吞吐量优先的应用尽可能的设置大可能到达Gbit的程度因为对响应时间没有要求垃圾收集可以并行进行一般适合CPU以上的应用 JVM调优之年老代大小选择 ◆响应时间优先的应用年老代使用并发收集器所以其大小需要小心设置一般要考虑并发会话率和会话持续时间等一些参数如果堆设置小了可以会造成内存碎片高回收频率以及应用暂停而使用传统的标记清除方式如果堆大了则需要较长的收集时间最优化的方案一般需要参考以下数据获得 并发垃圾收集信息 持久代并发收集次数 传统GC信息 花在年轻代和年老代回收上的时间比例 减少年轻代和年老代花费的时间一般会提高应用的效率 ◆吞吐量优先的应用一般吞吐量优先的应用都有一个很大的年轻代和一个较小的年老代原因是这样可以尽可能回收掉大部分短期对象减少中期的对象而年老代尽存放长期存活对象 JVM调优之较小堆引起的碎片问题 因为年老代的并发收集器使用标记清除算法所以不会对堆进行压缩当收集器回收时他会把相邻的空间进行合并这样可以分配给较大的对象但是当堆空间较小时运行一段时间以后就会出现碎片如果并发收集器找不到足够的空间那么并发收集器将会停止然后使用传统的标记清除方式进行回收如果出现碎片可能需要进行如下配置 ◆XX:+UseCMSCompactAtFullCollection:使用并发收集器时开启对年老代的压缩 ◆XX:CMSFullGCsBeforeCompaction=:上面配置开启的情况下这里设置多少次FullGC后对年老代进行压缩 |