jvm堆中对象和线程分配的一般过程

对象和线程分配的一般过程

这篇笔记来源于尚硅谷的学习笔记,感谢尚硅谷的老师!

线程分配过程如下:

由于堆是线程共享区域,因此为了防止出现线程不安全问题,而每创建一个对象都加锁的话则会影响分配速度。因此出现了TLAB的设计,堆Eden区域进行了划分,每个线程都有一个私有的缓存区域。即TLAB,每个TLAB仅占伊甸园区的1%。

在这里插入图片描述

那么jvm对于内存的分配过程具体如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jolNKRur-1644150796090)(C:\Users\双双同学\AppData\Roaming\Typora\typora-user-images\image-20220206195520561.png)]

首先jvm会为每个线程进行TLAB的分配,如果不成功,那么这个线程会在会在Eden中进行分配。

而对象的分配的一般过程如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bmQVv1aL-1644150796090)(C:\Users\双双同学\AppData\Roaming\Typora\typora-user-images\image-20220206200400895.png)]

内存分为:新生代(伊甸园区,s0,s1区)老年代。

s0和s1区又被称为from区和to区,谁是空的那么谁是to区。

  • 首先,对象会被分配在伊甸园区,当伊甸园区满的时候,jvm会进行YGC/Minor GC。(新生代的垃圾回收)。此时用户进程会停止,出现STW。

  • 当把伊甸园区的垃圾回收以后,将剩余的对象先放入s0,此时对象的年龄变为1。

  • 当再次往伊甸园区放入对象直至伊甸园区再次满了,jvm会再次进行YGC,我们jvm会将伊甸园区和s0区的对象都放入s1区,此时之前的s0区的对象和伊甸园区的对象的年龄都会+1。

  • 同理,当再次往伊甸园区放入对象直至伊甸园区满时,再次出发YGC,from区和伊甸园区的对象都会移如to区,同时他们的年龄+1.

  • 当对象的年龄超过设置好的阈值时,对象会被放入老年区。

  • 当对象的年龄超过设置好的阈值时,对象会被放入老年区。

具体流程图如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nAB5dW7B-1644150796091)(C:\Users\双双同学\AppData\Roaming\Typora\typora-user-images\image-20220206203220372.png)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值