JVM调优:选择合适的GC collector (三)

CMS Collector

在很多地方,CMS Collector常被翻译成“并发”,而ParallelGC被称为“并行”,但中文里,这两词的区分度并不明显。事实上,所谓的Parallel是指,在执行GC的时候将会有多个GC线程共同工作,但是,在执行GC的过程中仍然是“stop-the-world”。CMS的区别在于,在执行GC的时候,GC线程是不需要暂停application的线程,而是和它们“并发”一起工作。
所以,采用CMS的原因就在于它可以提供最低的pause time。

回到CMS的示意图:

 

这张图表示的是CMS在执行Full GC的过程,这个过程包括了6个步骤:
# STW initial mark
# Concurrent marking
# Concurrent precleaning
# STW remark
# Concurrent sweeping
# Concurrent reset

STW表示的意思就是“stop-the-world”。
所以,CMS也并不是完全不会暂停application的,在这六个步骤中,有两个步骤需要STW,分别是:initial mark和remark(如图所示)。而其它的四个步骤是可以和application“并发”执行。initial mark是由一个GC thread来执行,它的暂停时间相对比较短。而remark过程的暂停时间要比initial mark更长,且通常由多个thread执行。
这六个步骤的具体内容我就不写了(其实俺也似懂非懂),有兴趣的可以参考【1】,【2】。

 

接下来看看实验结果。


实验结果

 

JVM参数如下:

java -jar -Xms10g -Xmx15g -XX:+UseConcMarkSweepGC -XX:NewSize=6g -XX:MaxNewSize=6g -verbose:gc -XX:+PrintGCDetails -XX:+PrintGCTimeStamps  -Xloggc:./log/gc.log Slaver.jar

 

 

从图中可以看出,采用

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
对于Java JVM调优,可以采取以下几个方面的措施来提升性能和优化资源利用: 1. 堆内调优: - 调整堆大小:通过-Xms和-Xmx参数设置初始堆大小和最大堆大小,根据应用程序的需求进行适当的调整。 - 选择合适的垃圾回收器:根据应用程序的特点选择合适的垃圾回收器,如串行收集器、并行收集器、CMS收集器、G1收集器等。 - 设置新生代和老年代的比例:可以通过-XX:NewRatio参数来调整新生代和老年代的比例。 2. 栈内存调优: - 调整栈大小:通过-Xss参数设置栈的大小,根据应用程序的需求进行适当的调整。 3. 垃圾回收调优: - 监控GC日志:通过参数-XX:+PrintGC和-XX:+PrintGCDetails打印GC日志,以便进行分析和优化。 - 调整垃圾回收器参数:可以根据应用程序的特点和需求,通过-XX:+UseConcMarkSweepGC、-XX:+UseParallelGC等参数来选择垃圾回收器,并进行相应的调优。 4. 类加载调优: - 减少类加载时间:使用JIT编译器来提前编译一些热点代码,减少类加载的时间。 - 使用合适的类加载器:对于大型应用程序,可以合理使用多个类加载器,以提高类加载的效率。 5. 线程调优: - 控制线程数量:合理控制线程的数量,避免创建过多的线程导致资源竞争和上下文切换的开销。 - 使用线程池:使用线程池来管理线程,可以提高线程的复用率和系统的稳定性。 6. I/O调优: - 使用NIO:使用Java NIO(New I/O)来提升I/O操作的效率。 - 使用缓冲区:使用缓冲区来减少I/O操作次数,提高读写性能。 以上是一些常见的Java JVM调优方法,具体的调优策略和参数设置还需根据具体的应用场景和需求进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值