JVM中GC小对象配置

小对象配置

-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
运行
这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值