如何设置高并发系统的jvm堆内存大小
要解决的问题
- 系统要部署多少台机器
- 每台机器的内存空间
- 每台机器jvm堆内存大小
- jvm内存空间要多少,才能支撑这么多对象的创建 不至于进程直接奔溃
内存压力计算
-
qps估算
日活用户数量、高峰期时段多久、用户行为涉及到的接口、接口中创建的对象大小
举例:
(1) 假设用户系统高峰期 1w+qps 时, jvm内存要在一秒内能容纳下这一万多个用户信息实例
(2) 每天100万支付订单的交易系统,高峰期几个小时,平均到高峰期就是每秒100订单左右,要能容纳下这些订单对象
处理耗时比较长的场景会比较复杂,进行minor gc的时候会有 qps * n * timeout 多个对象还存活着(n为接口一次处理过程产生的对象个数) -
计算每个对象的大小
-
处理流程耗时
-
然后计算出系统大概多久会进行一次 minor gc(年轻代多久会塞满)
对于高并发的系统,如果请求耗时突然变成秒/十几秒(或者有个别接口耗时久),就很容易进入老年代: 系统并发较高 eden区很快就填满,然后进行 minor gc,慢接口引用的对象回收不掉,在多次minor gc后这些慢接口的对象就进入到老年代了
实际场景
其实一般公司运维提供的机器配置是固定的几档,如4核8G、8核16G 然后会有对应的较为通用的jvm参数配置模板
而且线上服务情况错综复杂、不会说一个时刻就只有一个链路在执行,需要根据预期要抗的qps、目标rt进行压测,确定保证机器负载在健康水平下达到目标需要多少台机器,同时观察gc情况,然后再具体根据minor gc stw、老年代增长速率、fullgc频率和时长等进行调整
本文来自博客园,作者:mushishi,转载请注明原文链接:https://www.cnblogs.com/mushishi/p/14546418.html