写点什么

JVM 调优简要思想及简单案例 - 为什么需要 JVM 调优?

作者:zarmnosaj
  • 2022 年 6 月 22 日
  • 本文字数:639 字

    阅读完需:约 2 分钟

接下来是一个例子,一个案例,我们什么情况下会需要 JVM 调优?


案例:假设一个订单后台服务,每秒有 300 个下单请求,服务器为 4 核 8G 后台服务每秒处理 100-300 个请求,每个请求产生的对象内存开销为 200KB,那么 300 个请求每秒会有 60MB 的内存开销。


一般 4 核 8G 给 JVM 的内存会到 4G,堆内存分配 3G,新生代 1.5G、老年代 1.5G。其中新生代 Eden 和 Survivor 区域比例为 8:1:1,分别为:1.2G、0.15G、0.15G


它会给一些操作系统或者其他程序也会留一些内存空间,它不会全部分配给 JVM 里面,我们假设这个案例里面内存它会分配,然后分配 3 个 G 然后还有一些其他比如说还有一些剩余的一个 G 会分配到比如说方法区这些。



每秒 300 个请求,每秒都会产生 60MB 的数据占据新生代空间,Eden 区域大概需要 20s 就会被占满。所以每 20s 之后都会进行新生代 GC,除了最近 1s 还在处理的请求,其他请求早已处理完成,所以基本上一下可以回收掉 99%的新生代对象。此时存活对象大概 100MB 左右。


此时新生代 GC 之后存活对象 100MB 会进入 Survivor 区,再运行 20s,Eden 区占满,再次回收 Eden 和 Survivor 区的对象,存活对象仍然有 100MB 左右数据进行入另一块 Survivor 区。


按照上述逻辑,每次新生代垃圾回收后存活对象在 100MB 左右,也不排除可能会突破 150MB 的可能,此情况会导致新生代 GC 发生后,存活对象无法放入 Survivor 区,会直接进入老年代。即使新生代 GC 发生后存活对象小于 150MB,但是 100MB 左右的存活对象进入 Survivor 区,也会触发 JVM 的动态年龄判断机制,因为这一批对象超过了 Survivor 区空间大小的 50%,此时也可能会直接进入老年代。

发布于: 刚刚阅读数: 3
用户头像

zarmnosaj

关注

靡不有初,鲜克有终 2020.02.06 加入

成都后端混子

评论

发布
暂无评论
JVM调优简要思想及简单案例-为什么需要JVM调优?_6月月更_zarmnosaj_InfoQ写作社区