边缘计算市场即将爆发
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 哪些对象会进入老年代?
这个接口的耗时一般在 200ms 左右,但在高并发情况下,内存资源这么吃紧,CPU 和 线程资源都会有很高的负载,这时候就很有可能出现一些性能抖动的情况 相应的表现就是接口的响应时间延长,甚至会出现超时,在频繁的 fgc 情况下:
(编辑:济宁站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |