首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

新版Springboot3+微服务实战12306高性能售票系统23章内附资料

Springboot3+微服务实战12306高性能售票系统

download:https://www.666xit.com/3927/

young gc、old gc、full gc、mixed gc 傻傻分不清?

这个问题的前置条件是你得知道 GC 分代,为什么分代。这个在之前文章提了,不清楚的能够去看看。

现在咱们来答复一下这个问题。

其实 GC 分为两大类,分别是 Partial GC 和 Full GC。

Partial GC 即部分搜集,分为 young gc、old gc、mixed gc。

young gc:指的是单单搜集年青代的 GC。

old gc:指的是单单搜集老时代的 GC。

mixed gc:这个是 G1 搜集器特有的,指的是搜集整个年青代和部分老时代的 GC。

Full GC 即整堆收回,指的是收取整个堆,包含年青代、老时代,假如有永久代的话还包含永久代。

其实还有 Major GC 这个名词,在《深化理解Java虚拟机》中这个名词指代的是单单老时代的 GC,也便是和 old gc 等价的,不过也有很多资料认为其是和 full gc 等价的。

还有 Minor GC,其指的便是年青代的 gc。

young gc 触发条件是什么?

大致上能够认为在年青代的 eden 快要被占满的时候会触发 young gc。

为什么要说大致上呢?因为有一些搜集器的收回完成是在 full gc 前会让先履行以下 young gc。

比方 Parallel Scavenge,不过有参数能够调整让其不进行 young gc。

可能还有别的完成也有这种操作,不过正常情况下就当做 eden 区快满了即可。

eden 快满的触发要素有两个,一个是为目标分配内存不行,一个是为 TLAB 分配内存不行。

full gc 触发条件有哪些?

这个触发条件略微有点多,咱们来看下。

在要进行 young gc 的时候,依据之前统计数据发现年青代均匀提升大小比现在老时代剩余空间要大,那就会触发 full gc。

有永久代的话假如永久代满了也会触发 full gc。

老时代空间缺乏,大目标直接在老时代请求分配,假如此刻老时代空间缺乏则会触发 full gc。

担保失利即 promotion failure,新生代的 to 区放不下从 eden 和 from 拷贝过来目标,或许新生代目标 gc 年龄抵达阈值需求提升这两种情况,老时代假如放不下的话都会触发 full gc。

履行 System.gc()、jmap -dump 等指令会触发 full gc。

知道 TLAB 吗?来说说看

这个得从内存请求说起。

一般而言生成目标需求向堆中的新生代请求内存空间,而堆又是全局同享的,像新生代内存又是规整的,是经过一个指针来划分的。

内存是紧凑的,新目标创建指针就右移目标大小 size 即可,这叫指针加法(bump [up] the pointer)。

可想而知假如多个线程都在分配目标,那么这个指针就会成为热门资源,需求互斥那分配的功率就低了。

所以搞了个 TLAB(Thread Local Allocation Buffer),为一个线程分配的内存请求区域。

这个区域只允许这一个线程请求分配目标,允许所有线程访问这块内存区域。

TLAB 的思维其实很简单,便是划一块区域给一个线程,这样每个线程只需求在自己的那亩地请求目标内存,不需求争抢热门指针。

当这块内存用完了之后再去请求即可。

这种思维其实很常见,比方分布式发号器,每次不会一个一个号的取,会取一批号,用完之后再去请求一批。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O7fDD4QsW-5jgO_6tnKTgeIA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券