加入收藏 | 设为首页 | 会员中心 | 我要投稿 济宁站长网 (https://www.0537zz.cn/)- 行业智能、边缘计算、专有云、AI硬件、5G!
当前位置: 首页 > 站长资讯 > 外闻 > 正文

边缘计算市场即将爆发

发布时间:2021-02-13 14:51:16 所属栏目:外闻 来源:互联网
导读:0 是经过调优确认不会引起这个问题才用。 为什么会造成 OOM 我会在以后的文章会中提到。 三、高并发下 JVM 是怎么玩的? 堆空间怎么分配内存? 虽然给堆空间分配了 12G 的内存,但新生代并不是一开始就把这 12G 一下就占满了,老年代还得占一部分。 也不是一开

0 是经过调优确认不会引起这个问题才用。

为什么会造成 OOM 我会在以后的文章会中提到。

三、高并发下 JVM 是怎么玩的?

堆空间怎么分配内存?

虽然给堆空间分配了 12G 的内存,但新生代并不是一开始就把这 12G 一下就占满了,老年代还得占一部分。

也不是一开始就将新老生代按个比例分配好空间,新生代一开始只会分配 5% 的堆内存空间,然后慢慢的增大,

这个是可以通过 -XX:G1NewSizePercent 来设置新生代初始占比的,其实维持这个默认值就可以了

同样老年代也是,并不是以开始就分配几个G ;因为 G1 是基于 Region 的逻辑来分区的。

到底多久会触发一次新生代的 YoungGC(ygc)?

有人说:新生代的 Eden 区空间不够用了就会触发 ygc 那到底 Eden区使用多少了才是内存不够呢?

有一个参数 -XX:G1MaxNewSizePercent 默认值:60% ,限定了新生代最多占用堆内存 60% 的空间,

那就是是 12G * 60% = 7.2G,然后 新生代又有 Eden 和 两个 Survivor 组成 默认比例是: 8:1:1,

7.2G * 0.8 = 5.76G , 是 Eden 区快到 5.7G 就触发 ygc 么?

并不是,G1 有个很重要的参数 -XX:MaxGCPauseMillis 这个参数的默认值是 200

意味着每次 进行垃圾回收,最长的停顿时间不超过 200ms。这也是为什么 G1 号称它造成的 STW 是停顿可控的。

做个大胆的假设: 200ms G1可以回收 300个Region 区域!

因为 G1 是在逻辑上区分 老年代和新生代的,整个堆被分成了 2048 个 Region 区域,12G 的堆内存平均每个 Region 的大小是 6MB

但 Region 的大小必须是 2的 N次幂,所以每个 Region 的大小会是 8mb

之前算出来了这个系统每秒钟往新生代输送的对象大小是 550mb ,550mb / 8mb = 68 ,平均每秒会有 68 个 Region 被占满,

回收 300 个 Region 需要 200ms , 300 / 68 = 4.5ms ,

大概 4.5ms 就会进行一次 ygc ,一分钟就会进行 13 次 ygc ,每次 ygc 200ms

这样分析就会发现 G1 的垃圾回收其实是很动态,很灵活的,它会根据你对 GC 的预期停顿时间来进行回收。

G1 哪些对象会进入老年代?

  1. 一个对象在年轻代里躲过15次垃圾回收,年龄太大了,寿终正寝,进入老年代
  2. 大对象直接送到老年代 参数 XX:PretenureSizeThreshold 来控制多大的对象才算大。XX:PretenureSizeThreshold=100000000 单位为btye
  3. 动态年龄判定规则,如果一旦发现某次新生代 GC 过后,存活对象超过了 Survivor 50%
  4. 一次 ygc 过后存活对象太多了,导致 Survivor 区域放不下了,这批对象会进入老年代

这个接口的耗时一般在 200ms 左右,但在高并发情况下,内存资源这么吃紧,CPU 和 线程资源都会有很高的负载,这时候就很有可能出现一些性能抖动的情况

相应的表现就是接口的响应时间延长,甚至会出现超时,在频繁的 fgc 情况下:

  1. 一些对象在 Survivor区 经过 15 次 ygc 后,就会晋升到老年代
  2. 很多接口的响应时间都延长,导致触发动态年龄判断规则,就会有一大批对象晋升到老年代,

 

(编辑:济宁站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读