JVM系列(三十七) JVM调优实战-JVM参数Eden区到底如何调优

374 阅读4分钟

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参数,本文是大致的计算思路,比如你不存在晚高峰,只有早高峰这种情况,具体情况要具体分析

  1. 100W的请求量,肯定不是平均到每分每秒的,早晚高峰6:日常平均4,所以 早或晚高峰要支撑60W的并发
  2. 早高峰就按照1小时来算, 1小时60W, 600000/3600=166, 也就是早晚高峰每秒要有166次请求
  3. 我们线上服务器一般都是3台服务器, 来平均分摊流量,所以每台服务器每秒 要支撑 166/3 = 55次请求
  4. 每次请求加载进内存的大小 该如何计算?比如这次请求,需要加载内存的对象有 50个字段, 一个字段设置 varchar200位, 200位/8 = 24Byte, 有50个字段, 也就是 50*24Byte 那就是 1200B = 1.2KB
  5. 现在有 55次请求, 这样的对象, 那么需要 55*1.2KB = 66KB
  6. 系统之间要经过RPC序列化, DB写库, 缓存, IO通信, 业务的复制拷贝, 一般一个对象被放大 20-50倍 就按 放大30倍, 一次请求加载进内存也就是 66KB*30=1980KB=1.98M
  7. 一秒1.98M, 如果说服务器现在是1G的内存, 默认配置 新生代:老年代=1:2 新生代就是 1G/3=333M
  8. 1:1:8 from:to:eden,那么Eden区 就是 333 * 8 / 10 = 266M
  9. 按照1秒 2M的频率, 130 秒就要 发生一次YongGC
  10. 明显是不够的, 所以扩大一倍 2G, 也就是 260S发生一次YongGC, 依旧很频繁
  11. 所以再扩大一倍4G, 也就是 520s, 几个小时才会触发一次MinorGC。这才是正常频率

经过上面的计算, 我们预估 100W的请求量, 大概需要4G的内存才能保证 几个小时520秒 才出发一次YongGC, 满足我们的要求, 这里只是我们预计预算的,并不包含系统占用的资源,具体情况还要看具体的配置

新的系统一定要严格经过压测, 明确知道自己的承受能力是多少请求量,这样才不会频繁的宕机事故


至此 我们我们通过一个实际的例子,说明100w的请求量,我们要如何配置JVM参数,并且通过对 本次请求对象的内存大小的分析,预估了YongGC的频率,保证服务器正常运行