本文经开发者头条原创作者 江南白衣Calvin 授权发布,著作权归作者所有。
作者目前在唯品会担任资深架构师。
欢迎订阅 江南白衣Calvin 的开发者头条独家号《江南白衣的Java后端架构》
在关键的业务系统里,除了继续追求技术人员最爱的高吞吐与低延时之外,系统的稳定性与出现问题时排查的便捷性也很重要。
这是本文的一个原则,后面也会一次又一次的强调,所以与网上其他的文章略有不同,请调优高手和运维老大们多指引。
前言1,资料
学**开源项目的启动脚本是个不错的主意,比如Cassandra家的, 附送一篇解释它的文章。
JVM调优的"标准参数"的各种陷阱 R大的文章,在JDK6时写的,期待更新。
偶然翻到Linkedin工程师的一篇文章。
前言2, -XX:+PrintFlagsFinal打印参数值
当你在网上兴冲冲找到一个可优化的参数时,先用-XX: +PrintFlagsFinal看看,它可能已经默认打开了,再找到一个,还是默认打开了...
JDK7与JDK8,甚至JDK7中的不同版本,有些参数值都不一样,所以不要轻信网上任何文章,一切以生产环境同版本的JDK打出来的为准。
经常以类似下面的语句去查看参数,偷懒不起应用,用-version代替。有些参数设置后会影响其他参数,所以查看时也把它带上。
java -server -Xmx1024m -Xms1024m -XX:+UseConcMarkSweepGC -XX:+PrintFlagsFinal -version| grep ParallelGCThreads
前言3,关于默认值
JDK8会默认打开-XX:+TieredCompilation多层编译,而JDK7则不会。JDK7u40以后的版本会默认打开-XX:+OptimizeStringConcat优化字符串拼接,而之前的则不打开。
对于这些参数,我的建议是顺势而为,JDK在那个版本默认打开不打开总有它的理由。安全第一,没有很好的因由,不要随便因为网上某篇文章的推荐(包括你现在在读的这篇)就去设置。
1. 性能篇
先写一些不那么常见的,后面再来老生常谈。
1.1 取消偏向锁 -XX:-UseBiasedLocking
JDK1.6开始默认打开的偏向锁,会尝试把锁赋给第一个访问它的线程,取消同步块上的synchronized原语。如果始终只有一条线程在访问它,就成功略过同步操作以获得性能提升。
但一旦有第二条线程访问这把锁,JVM就要撤销偏向锁恢复到未锁定线程的状态,详见 JVM的Stop The World,安全点,黑暗的地底世界, 可以看到不少RevokeBiasd的纪录,像GC一样,会Stop The World的干活,虽然只是很短很短的停顿,但对于多线程并发的应用,取消掉它反而有性能的