JVM参数Eden区到底如何调优
1.JVM Eden区
我们都知道JVM调优,但是到底如何调整参数,或者如何判断该如何进行调优,参数具体设置多大才算合适?这块并没有给出明确的结论,所以很多人都是一脸懵逼的,都说JVM调优,有没有一个具体实战的经验,其实没有你想的那么复杂,下面我们通过两个实例 来告知大家如何进行JVM调优
Eden区就是我们所说的新生代,针对新生代的对象的存活特点,来进行JVM调优,Eden区对象的特点如下:
- 所有的对象几乎都是在新生代中创建的
- 新生代也是死亡率最高的区域,朝生夕死
- 新生代对象90%都是使用一次后就要销毁的
- 新生代不足,就会触发YoungGC来进行垃圾回收
2.每天100W的请求量,要从哪几点考虑
要推算出来 100W的请求量,需要如何设置JVM参数? 我们要从以下几点进行判断
- 请求量 ,每次触发请求, 加载进内存的数据量有多大 ?
- 到底是吞吐量优先还是响应时间优先,决定我们选择哪种垃圾收集器
- 堆内存大小的配置, 配置多大的堆内存,才不会频繁的YoungGC
- 压测 增大请求量,看看多少的请求会导致FullGC,触发老年代对象回收
- 服务器资源 N核CPU NG内存 如何规划 每个区域大小 新生代/老年代 大小如何规划
- 大对象, 到底多大的对象 不经过新生代,直接放入老年代比较合适
- 对象存活多久,年龄叠加到达到进入老年代的标准
- OOM时候,JVM参数打印gc日志及dump文件
3. 100W的请求量,实战设置JVM参数
下面我们来计算一下,上面的问题, 100W的请求量,我们要如何计算出实际使用的内存,来设置JVM参数,本文是大致的计算思路,比如你不存在晚高峰,只有早高峰这种情况,具体情况要具体分析
- 100W的请求量,肯定不是平均到每分每秒的,早晚高峰6:日常平均4,所以 早或晚高峰要支撑60W的并发
- 早高峰就按照1小时来算, 1小时60W, 600000/3600=166, 也就是早晚高峰每秒要有166次请求
- 我们线上服务器一般都是3台服务器, 来平均分摊流量,所以每台服务器每秒 要支撑 166/3 = 55次请求
- 每次请求加载进内存的大小 该如何计算?比如这次请求,需要加载内存的对象有 50个字段, 一个字段设置 varchar200位, 200位/8 = 24Byte, 有50个字段, 也就是 50*24Byte 那就是 1200B = 1.2KB
- 现在有 55次请求, 这样的对象, 那么需要 55*1.2KB = 66KB
- 系统之间要经过RPC序列化, DB写库, 缓存, IO通信, 业务的复制拷贝, 一般一个对象被放大 20-50倍 就按 放大30倍, 一次请求加载进内存也就是 66KB*30=1980KB=1.98M
- 一秒1.98M, 如果说服务器现在是1G的内存, 默认配置 新生代:老年代=1:2 新生代就是 1G/3=333M
- 1:1:8 from:to:eden,那么Eden区 就是 333 * 8 / 10 = 266M
- 按照1秒 2M的频率, 130 秒就要 发生一次YongGC
- 明显是不够的, 所以扩大一倍 2G, 也就是 260S发生一次YongGC, 依旧很频繁
- 所以再扩大一倍4G, 也就是 520s, 几个小时才会触发一次MinorGC。这才是正常频率
经过上面的计算, 我们预估 100W的请求量, 大概需要4G的内存才能保证 几个小时520秒 才出发一次YongGC, 满足我们的要求, 这里只是我们预计预算的,并不包含系统占用的资源,具体情况还要看具体的配置
新的系统一定要严格经过压测, 明确知道自己的承受能力是多少请求量,这样才不会频繁的宕机事故
至此 我们我们通过一个实际的例子,说明100w的请求量,我们要如何配置JVM参数,并且通过对 本次请求对象的内存大小的分析,预估了YongGC的频率,保证服务器正常运行