JVM内存分配

内存规整

堆中的内存空间是否是规整的(连续的),由JVM垃圾收集器所采用的垃圾回收算法决定,如果垃圾回收算法是带有压缩算法的,则为连续的、规整的,如果垃圾回收算法是标记-清除算法(例如CMS收集器),则内存是不连续的、不规整的。
内存空间规整与否,决定这内存的分配方式。

内存分配方式

指针碰撞

内存空间是规整的,连续的内存中,一边是已分配的内存空间,一边是尚未分配的内存空间,两部分空间的中间有一个指针,通过移动指针的方式,来完成新对象实例的内存分配,这种分配方式叫指针碰撞法。

空闲列表

内存是不规整的,只能找一块足够大的空间,分配给对象实例,这种分配方式叫空闲列表法。

并发指针碰撞问题

同一块内存区域执行指针碰撞,会有并发问题,解决办法是:
1、为分配内存空间的动作进行同步加锁处理。
2、使用本地线程分配缓冲(TLAB,即Thread Local Allowcation Buffer)。

TLAB

为每个线程在堆中预先分配一小块内存TLAB,线程在各自的TLAB上为自己的实例对象分配内存空间。
当TLAB使用完时,加同步锁,然后分配新的TLAB。

原文地址:https://www.cnblogs.com/guodongdidi/p/10073389.html