小对象配置
-XX:+UseTLAB
表示,使用TLAB
TLAB
Thread Local Allocation Buffer
线程本地分配缓存
一个线程专用的内存分配区域,为了加速对象分配
每一个线程,都会产生一个TLAB,该线程独享的工作区域
每一个线程,都会默认使用TLAB区域
TLAB用来避免多线程冲突问题,提高对象分配效率
内存大小
TLAB空间一般不会太大
存放过程
如果,对象超过了eden区对象设置的大小
eden区放不下,会优先放到TLAB区
如果,TLAB区根据设置的对象大小
TLAB区也放不下,会直接分配在堆上
package com.bjsxt.base001;
import java.util.HashMap;
import java.util.Map;
public class Test06 {
public static void main(String[] args) {
//这种现象原因为:虚拟机对于体积不大的对象 会优先把数据分配到TLAB区域中,因此就失去了在老年代分配的机会
//参数:-Xmx30M -Xms30M -XX:+UseSerialGC -XX:+PrintGCDetails -XX:PretenureSizeThreshold=1000 -XX:+UseTLAB
Map<Integer, byte[]> m = new HashMap<Integer, byte[]>();
for(int i=0; i< 5*1024; i++){
byte[] b = new byte[1024];
m.put(i, b);
}
}
}
程序分析
每次需要1K,总共需要5M内存
测试
配置参数
-Xmx30M -Xms30M -XX:+UseSerialGC -XX:+PrintGCDetails -XX:PretenureSizeThreshold=1000 -XX:+UseTLAB
使用TLAB区域
每次需要1K,大于1000,直接放到堆内存
优先放到TLAB区域,因此,堆占用空间为0
这5M数据,都放在了TLAB区
运行
测试
配置信息
-Xmx30M -Xms30M -XX:+UseSerialGC -XX:+PrintGCDetails -XX:PretenureSizeThreshold=1000
不配置使用TLAB
默认是使用TLAB区域
因此,还会放在TLAB区域,堆内存使用为0
运行
测试
配置参数
-Xmx30M -Xms30M -XX:+UseSerialGC -XX:+PrintGCDetails -XX:PretenureSizeThreshold=1000 -XX:-UseTLAB
减号,不使用TLAB区域
需要1K,大于1000
由于,没有TLAB区域
这些对象会分配在堆上,为5M
运行