通俗易懂理解JAVA虚拟机(二)——JVM总体结构深度解析

通俗易懂理解JAVA虚拟机(二)——JVM总体结构深度解析,JVM内存参数设置实战
已有足够多的优秀的介绍JVM内存模型的文章,在这里再也不过多赘述直接上图。本文主要详解大型电商互联网公司如何设置JVM的内存参数。
一 . JVM总体结构及内存模型
在这里插入图片描述
2、JVM内存参数设置
Spring Boot程序的JVM参数设置格式(Tomcat启动直接加在bin目录下catalina.sh文件里):
1java ‐Xms2048M ‐Xmx2048M ‐Xmn1024M ‐Xss512K ‐XX:MetaspaceSize=256M ‐XX:MaxMetaspaceSize=256M ‐jar microservice‐eureka‐server.jar
StackOverflowError示例:
在这里插入图片描述java

在这里插入图片描述
结论:-Xss设置越小count值越小,说明一个线程栈里能分配的栈帧就越少,可是对JVM总体来讲能开启的线程数会更多
JVM内存参数大小该如何设置?
JVM参数大小设置并无固定标准,须要根据实际项目状况分析,给你们举个例子web

日均百万级订单交易系统如何设置JVM参数服务器

在这里插入图片描述
一天百万级订单这个绝对是如今顶尖电商公司交易量级,对于这种量级的系统咱们该如何设置JVM参数了?svg

咱们能够试着估算下,其实日均百万订单主要也就是集中在当日的几个小时生成的,咱们假设是三小时,也就是每秒大概生成100单左右。性能

这种系统咱们通常至少要三四台机器去支撑,假设咱们部署了四台机器,也就是每台每秒钟大概处理完成25单左右,往上毛估每秒处理30单吧。spa

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

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

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

若是咱们选择4核8G的服务器,就能够给JVM进程分配四五个G的内存空间,那么堆内存能够分到三四个G左右,因而能够给新生代至少分配2G,这样算下差很少须要半小时到一小时才能把新生代放满触发minor gc,这就大大下降了minor gc的频率,因此通常咱们线上服务器用得较多的仍是4核8G的服务器配置。server

若是系统业务量继续增加那么能够水平扩容增长更多的机器,好比五台甚至十台机器,这样每台机器的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次数。

在这里插入图片描述