如何设置高并发系统的jvm堆内存大小

要解决的问题

  • 系统要部署多少台机器
  • 每台机器的内存空间
  • 每台机器jvm堆内存大小
  • jvm内存空间要多少,才能支撑这么多对象的创建 不至于进程直接奔溃

内存压力计算

  1. qps估算
    日活用户数量、高峰期时段多久、用户行为涉及到的接口、接口中创建的对象大小
    举例:
    (1) 假设用户系统高峰期 1w+qps 时, jvm内存要在一秒内能容纳下这一万多个用户信息实例
    (2) 每天100万支付订单的交易系统,高峰期几个小时,平均到高峰期就是每秒100订单左右,要能容纳下这些订单对象
    处理耗时比较长的场景会比较复杂,进行minor gc的时候会有 qps * n * timeout 多个对象还存活着(n为接口一次处理过程产生的对象个数)

  2. 计算每个对象的大小

  3. 处理流程耗时

  4. 然后计算出系统大概多久会进行一次 minor gc(年轻代多久会塞满)

对于高并发的系统,如果请求耗时突然变成秒/十几秒(或者有个别接口耗时久),就很容易进入老年代: 系统并发较高 eden区很快就填满,然后进行 minor gc,慢接口引用的对象回收不掉,在多次minor gc后这些慢接口的对象就进入到老年代了

实际场景

其实一般公司运维提供的机器配置是固定的几档,如4核8G、8核16G 然后会有对应的较为通用的jvm参数配置模板
而且线上服务情况错综复杂、不会说一个时刻就只有一个链路在执行,需要根据预期要抗的qps、目标rt进行压测,确定保证机器负载在健康水平下达到目标需要多少台机器,同时观察gc情况,然后再具体根据minor gc stw、老年代增长速率、fullgc频率和时长等进行调整

posted @ 2021-03-16 22:29  mushishi  阅读(665)  评论(0编辑  收藏  举报