JVM 调优简要思想及简单案例 - 为什么需要 JVM 调优?
接下来是一个例子,一个案例,我们什么情况下会需要 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%,此时也可能会直接进入老年代。
版权声明: 本文为 InfoQ 作者【zarmnosaj】的原创文章。
原文链接:【http://xie.infoq.cn/article/d0a519e4e966b79135a7c1a00】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论