TLAB解读
单线程分配内存
单线程环境下JVM对于内存的分配是没有冲突的,目前有两种分配方式
-
指针碰撞(bump-the-pointer)
-
空闲列表
-
首先,在class文件被加载进JVM时,就可以在分配内存前计算出内存分配的大小。
-
如果采用指针碰撞的方式分配内存(下面我叫它撞针分配),由于可分配内存并不是连续的,会导致
1.如果指针所在的那块内存剩下可分配内存满足要分配内存的大小,则可以在这块内存分配
2.如果满足不了所有分配的内存大小,会导致指针频繁的找另一块内存去分配,造成Cpu执行效率不高,进而影响到内存分配的效率。(时间都花费在找可用内存上了)
-
所以可以使用空闲列表加上撞针分配的方式
具体的流程是:FreeList记录内存使用情况,并且释放的对象内存加入 FreeList,下次分配对象的时候,优先从 FreeList 中寻找合适的内存大小进行分配,之后再在合适的内存中撞针分配。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DP8IhNPM-1626016411992)(C:\Users\Administrator\Pictures\jvm\指针碰撞和空闲列表.png)]
但如果是多线程环境下呢?
我们可以考虑这样一种情况:
在多线程环境下,必须要保证分配内存的安全性&#x