JVM学习记录—JVM参数优化案例

本案例主要参考狸猫技术窝“从 0 开始带你成为JVM实战高手”系列文章。

以百万级别的交易系统为例

上图为一个交易系统的核心流程概况

目前系统最大的压力是创建上百条订单时候系统的压力,具体可以考虑下面几个问题

  • 需要多少台机器
  • 机器内存多少
  • 如何给JVM分配内存
  • JVM中年轻代、老年代等如何分配

预估系统压力

假设每天100万个支付订单,那么一般用户交易行为都会发生在每天的高峰期几个小时,用100万平均分配到几个小时里,那么大概是每秒100笔订单左右,假设部署了三台机器,每台机器每秒的压力是30笔。

如果订单表只有三个字段(Interger userId、Long createTime、Integer orderId),这样一共是16个字节。但实际上一个订单需要有几十个实例变量,预估为一个订单需要500字节的空间。这样每台机器每秒的压力为500*30约为15KB。而真实系统中肯定不单单仅有这一个对象,应把预估的结果扩大10-20倍,即每秒创建出的对象约为1MB。

如何设置堆内存?

上文可知,每秒订单系统占用的内存约为1MB,这样多次请求Eden区满后就会触发MinorGC。以一台4核8G的机器为例,这时候分给JVM 4G内存,但是这4G还得分配给方法区、栈和堆等。所以堆分配3G的话比较合适。新生代可以分得大一些,分2G,老年代1G。

案例进一步分析

假如现在要双十一了,要举行大促活动。之前系统的压力最大为30笔每秒。如果这是骤增为300笔呢?

这样每秒对内存的占用上升到几十乃至几百兆,并且由于系统压力,原来一两秒就能处理完的请求这时候需要几十秒。这样导致新生代堆积了大量的对象,这些对象也都被引用,无法被MinorGC回收,它们就会被转移到老年代中。而老年代的内存也不是无限的,老年代的回收对性能的影响是极大的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值