Java面试中总问的jvm调优到底是什么?
面试总问的jvm调优到底是什么?
文章来源:程序员知识码头
链接:https://mp.weixin.qq.com/s/433Gz3gLEWCAhG4LGfVcjw
了解更多JVM知识,获取更多Java资料加博主Vx:gyhycx7980
请注意,jvm调优,调的是稳定,并不能带给你性能的大幅提升。
服务稳定的重要性就不用多说了,保证服务的稳定,gc永远会是Java程序员需要考虑的不稳定因素之一。
复杂和高并发下的服务,必须保证每次gc不会出现性能下降,各种性能指标不会出现波动,gc回收规律而且干净,找到合适的jvm设置。详细了解jvm的话请看神书《深入理解java虚拟机》。
说些题外话,面试发现,jvm调优很多人都没有经验,有人甚至怀疑这东西真正是否有用,有的公司统一jvm的设置贯穿所有服务。其实只是没碰到生产条件复杂的情况而已。
举个简单例子:
我曾经的公司,碰到过服务运行超过14h直接死机的问题,头天下午压测,第二天上午服务自动重启了,按照当时习惯,新服务需要压力测试满12h,原则上我的服务通过测试,由于测试环境复杂,所有开发都可以登陆而且脚本很多,qa认为可能是有脚本误杀了,但是当时离上线deadline时间还早,于是决定再压力一次,成功复现,最后查看jvm发现每次fullgc之后o区总是会多一点,jmap打印内存栈发现char对象使用逐渐增大,最后撑满内存, 最后定位到调用JNI发生内存泄露,解决了这个问题。
这只是简单的一次,在那家公司,由于服务偏算法而且流量很高,碰到过很多这种问题。
还有一次,压力测试loadrunner图像显示每隔一段时间的点上响应时间立刻下降,过2s又恢复正常,规律性很强,通过jstat发现频繁生成大对象直接进入老年代,老年代很快撑大触发full gc回收,回收时间过长造成服务暂停明显,立刻反应到压测的响应上。
解决的办法:
调大年轻代,让大对象可以在年轻代触发yong gc,调整大对象在年轻代的回收频次,尽可能保证大对象在年轻代回收,减小老年代缩短回收时间,服务果然稳定下来。当时这么调整下来会有一点性能损失,基本可以忽略不计,但是提升了服务的稳定性,这才是这次jvm调优最重要的。