对象和线程分配的一般过程
这篇笔记来源于尚硅谷的学习笔记,感谢尚硅谷的老师!
线程分配过程如下:
由于堆是线程共享区域,因此为了防止出现线程不安全问题,而每创建一个对象都加锁的话则会影响分配速度。因此出现了TLAB的设计,堆Eden区域进行了划分,每个线程都有一个私有的缓存区域。即TLAB,每个TLAB仅占伊甸园区的1%。
那么jvm对于内存的分配过程具体如下:
首先jvm会为每个线程进行TLAB的分配,如果不成功,那么这个线程会在会在Eden中进行分配。
而对象的分配的一般过程如下:
内存分为:新生代(伊甸园区,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.
-
当对象的年龄超过设置好的阈值时,对象会被放入老年区。
-
当对象的年龄超过设置好的阈值时,对象会被放入老年区。
具体流程图如下: