:新生代串行收集器(默认收集器) 算法复制算法 XX:+UseSerialGC 指定使用新生代串行收集器和老年代串行收集器 优点效率高久经考验 缺点串行如果回收对象过多或者堆过大停顿时间会过长 :老年代串行收集器(cms收集器的备选) 算法标记压缩算法 XX:+UseSerialGC:指定新生代串行收集器和老年代串行收集器 XX:+UseParNewGc:新生代使用并行收集器和老年代使用串行收集器 XX:+UseParallelGc:新生代使用并行回收收集器和老年代使用串行收集器 :并行收集器 算法复制算法 工作在新生代的垃圾收集器简单的将串行回收器多线程化策略和串行一样也是独占式的在多cpu环境下会比串行收集器好停顿时间短 XX:+UseParNewGC:新生代使用并行收集器老年代使用串行回收器 XX:+UseConcMarkSweepGC:新生代使用并行收集器老年代使用cms 线程数量 XX:ParallelGCThreads指定一般最好与cpu数量相当cpu小于个时和cpu数量一样cpu大于个时 +[(*cpu/)] :新生代并行回收收集器(Parallel Scavenge) 算法复制算法 和并行收集器一样区别在于这个收集器关注系统吞吐量 XX:+UseParallelGC:新生代使用并行回收收集器老年代使用串行收集器 XX:+UseParallelOldGC:新生代和老年代都使用并行回收收集器 吞吐量设置 XX:MaxGCPauseMillis:设置停顿时间不超过多少大于的整数收集器会调整对的大小或者其他一些参数使得垃圾收集停顿时间控制在设置的时间 XX:GCTimeRatio:设置吞吐量大小~之间的整数 公式/(+n)系统将花费不超过这个时间来用于垃圾收集 XX:useAdaptiveSizePolicy:打开自适应gc策略新生代大小eden和servivor的比例晋升老年代的对象年龄都会自动调整以达到对大小吞吐量和停顿时间之间的平衡 :老年代并行回收收集器 算法标记压缩算法 和新生代并行回收器一样它也是一种关注吞吐量的收集器 XX:+UseParallelOldGC:新生代和老年代都使用并行回收收集器 :cms收集器 算法标记清除算法 和并行回收收集器的区别是注重系统停顿时间 工作步骤 初始标记独占资源 并发标记非独占资源 重新标记独占资源 并发清除非独占资源 并发重置非独占资源 XX:ParallelGCThreads:设置cms的线程数量默认启动线程数是(ParallelGCThreads+/) XX:CMSInitiatingOccupancyFraction:设置当老年代空间实用率达到百分比值时进行一次cms回收 因为使用标记清除算法所以长时间后会有碎片产生 XX:+UseCMSCompactAtFullCollection:设置cms在垃圾收集完成后进行一次内存碎片整理 XX:CMSFullGCsBeforeCompaction:设定进行多少次cms回收后进行一次内存压缩 应为cms不停止应用程序所以在cms回收过程中可能因为内存不足而导致回收失败失败的话会启动老年代串行收集器进行垃圾回收这样应用程序将完全中断这时停顿时间可能会很长可以通过设置XX:CMSInitiatingOccupancyFraction来解决 :G收集器(garbage first) jdkupdate才提供预览版jdk才发布 总结 在众多的垃圾回收器中没有最好的只有最适合应用的回收器根据应用软件的特性以及硬件平台的特点选择不同的垃圾回收器才能有效的提高系统性能 jvm调优思路与方法 :将新对象预留在新生代 一般来说当survivor区空间不够或者占用量达到%时就会将对象进入老年代(不管对象年龄有多大) :大对象进入老年代 开发中要避免短命的大对象目前没有特别好的方法回收短命大对象大对象最好直接进入老年区因为大对象在新生区占用空间大会由于空间不足而导致很多小对象进入到老年区 XX:PretenureSizeThreshold:设置大对象直接进入老年代的阈值当对象的大小超过这个值将直接分配在老年代 :设置对象进入老年代 的年龄 XX:MaxTenuringThreshold:设置对象进入老年代的年龄默认值时但是如果空间不够还是会将对象移到老年代 :稳定与震蕩的堆大小 稳定的堆大小能减少gc次数但是每次gc时间增加 震蕩的堆大小能增加gc次数但是每次gc时间减少 XX:MinHeapFreeRatio:最小空闲比例当堆空间空闲内存小于这个比例则扩展 XX:ManHeapFreeRatio:最大空闲比例当堆空间空闲内存大于这个比例则压缩 Xms和Xmx相等时上面的参数失效 :吞吐量方案 G内存核吞吐量优先方案尽可能减少系统的执行垃圾回收的总时间考虑使用关注吞吐量的并行回收收集器 Xms: Xmx: Xss:k //减少线程栈大小使剩余系统内存支持更多线程 Xmn:g //设置新生代大小 XX:UseParallelGC:新生代并行回收收集器 XX:ParallelGCTHreads:设置线程数 XX:+UseParallelOldGC:老年代也使用并行回收收集器 :使用大页案例 Xmx: Xms: Xss:k //减少线程栈大小使剩余系统内存支持更多线程 XX:UseParallelGC:新生代并行回收收集器 XX:ParallelGCTHreads: XX:+UseParallelOldGC:老年代也使用并行回收收集器 XX:LargePageSizeInBytes=m :降低停顿案例 降低停顿首先考虑的是使用关注系统停顿的cms回收器其次为了减少fullgc次数应尽可能将对象预留在新生代因为新生代minorgc的成本远小于老年代的fullgc Xms: Xmx: Xss:k //减少线程栈大小使剩余系统内存支持更多线程 Xmn:g //设置新生代大小 XX:ParallelGCThreads: XX:+UseConcMarkSweepGC //老年代使用cms回收器 XX:+UseParNewGC //新生代使用并行回收器 XX:SurvivorRatio= //设置eden和survivor比例为: XX:TargetSurvivorRatio= //设置survivor使用率 XX:MaxTenuringThreshold= //年轻对象进入老年代的年龄默认是这里是 |