Java对象所占用的内存,多数是堆上进行分配,堆是所有线程共享的,因此在堆上进行分配需要进行加锁,这导致了创建对象开销很大。 当堆上空间不足时,会触发GC,如果GC后空间仍然不足,则会抛出OutOfMemory错误

Sun JDK为了提升内存分配效率,会为每个新创建的线程在新生代Eden Space上分配一个块独立的空间,成为TLAB(Thread Local Allocation Buffer),大小由JVM根据运行情况计算而得,可通过-XX:TLABWasteTargetPercent来设置TLAB所占用的Eden Space比例,默认为1%。

JVM根据上述比率、线程数量及线程是否频繁分配对象给每个线程分配合适大��的TLAB。在TLAB上分配内存时,不需要加锁,因此JVM在线程中的对象分配内存时,会尽量在TLAB上分配,如果对象过大或TLAB空间已用完,依旧会进行内存分配

因此,编写JAVA程序时,通常多个小对象比大的对象分配起来更加高效

可以通过在启动参数上添加-XX:PrintTLAB,来查看TLAB空间使用情况