(一)JVM的优化

基础

你必须了解什么是JVM,JVM的分配。JVM的参数。服务器

了解你本身的业务

  • 1.了解本身的业务目标
  • 2.计算每台机器实现的tps。
  • 3.每一个tps须要的对象空间,计算每秒须要的空间。
  • 4.分析青年代,老年队GC须要的时间。承受的时间。
  • 5.根据承受能力,设置JVM参数。

一天百万级订单这个绝对是如今顶尖电商公司交易量级,对于这种量级的系统咱们该如何设置JVM参数性能

咱们能够试着估算下,其实日均百万订单主要也就是集中在当日的几个小时生成的,咱们假设是三小时,也就是每秒大概生成100单左 右。 这种系统咱们通常至少要三四台机器去支撑,假设咱们部署了四台机器,也就是每台每秒钟大概处理完成25单左右,往上毛估每秒处理30 单吧。操作系统

也就是每秒大概有30个订单对象在堆空间的新生代内生成,一个订单对象的大小跟里面的字段多少及类型有关,好比int类型的订单id和用户id等字段,double类型的订单金额等,int类型占用4字节,double类型占用8字节,初略估计下一个订单对象大概1KB左右,也就是说每秒会有30KB的订单对象分配在新生代内。对象

真实的订单交易系统确定还有大量的其余业务对象,好比购物车、优惠券、积分、用户信息、物流信息等等,实际每秒分配在新生代内的对象大小应该要再扩大几十倍,咱们假设30倍,也就是每秒订单系统会往新生代内分配近1M的对象数据,这些数据通常在订单提交完的操做作完以后基本都会成为垃圾对象。blog

咱们通常线上服务器的配置用得较多的就是双核4G或4核8G,若是咱们用双核4G的机器,由于服务器操做系统包括一些后台服务自己可能就要占用1G多内存,也就是说给JVM进程最多分配2G多点内存,刨开给方法区和虚拟机栈分配的内存,那么堆内存可能也就能分配到1G多点,对应的新生代内存最后可能就几百M,那么意味着没过几百秒新生代就会被垃圾对象撑满而出发minor gc,这么频繁的gc对系 统的性能仍是有必定影响的。进程

若是咱们选择4核8G的服务器,就能够给JVM进程分配四五个G的内存空间,那么堆内存能够分到三四个G左右,因而能够给新生代至少分配2G,这样算下差很少须要半小时到一小时才能把新生代放满触发minor gc,这就大大下降了minor gc的频率,因此通常咱们线上服务器用得较多的仍是4核8G的服务器配置。 若是系统业务量继续增加那么能够水平扩容增长更多的机器,好比五台甚至十台机器,这样每台机器的JVM处理请求能够保证在合适范围,不至于压力过大致使大量的gc。内存

有的同窗可能有疑问说双核4G的服务器好像也够用啊,无非就是minor gc频率稍微高一点呀,不是说minor gc对系统的影响不是特别大吗,我成本有限,只能用这样的服务器啊。部署

其实若是系统业务量比较平稳也能凑合用,若是常常业务量可能有个几倍甚至几十倍的增加,好比时不时的搞个促销秒杀活动什么的,那咱们思考下会不会有什么问题。虚拟机

假设业务量暴增几十倍,在不增长机器的前提下,整个系统每秒要生成几千个订单,以前每秒往新生代里分配的1M对象数据可能增加到几十M,并且由于系统压力骤增,一个订单的生成不必定能在1秒内完成,可能要几秒甚至几十秒,那么就有不少对象会在新生代里存活几十秒以后才会变为垃圾对象,若是新生代只分配了几百M,意味着一二十秒就会触发一次minor gc,那么颇有可能部分对象就会被挪到 老年代,这些对象到了老年代后由于对应的业务操做执行完毕,立刻又变为了垃圾对象,随着系统不断运行,被挪到老年代的对象会愈来愈多,最终可能又会致使full gc,full gc对系统的性能影响仍是比较大的。电商

若是咱们用的是4核8G的服务器,新生代分配到2G以上的水平,那么至少也要几百秒才会放满新生代触发minor gc,那些在新生代即使存活几十秒的对象在minor gc触发的时候大部分已经变为垃圾对象了,均可以被及时回收,基本不会被挪到老年代,这样能够大大减小老年代的full gc次数。

总结

从技术到业务,根据方法论去处理相关的东西,作到活学活用。

相关文章
相关标签/搜索