JVM 内存分配策略

引言

在 Java 虚拟机(JVM)中,内存分配与垃圾回收是影响程序性能的核心机制。内存分配的高效性直接决定了对象创建的速率,而垃圾回收策略则决定了内存的利用率以及系统的稳定性。为了在复杂多变的应用场景中实现高效的内存管理,JVM 提供了多种内存分配策略,如指针碰撞、空闲列表以及 TLAB(Thread Local Allocation Buffer),并结合不同的垃圾回收器,灵活应对各种内存分配需求。

1. 指针碰撞

假设堆内存是规整的,所有使用过的内存被放到一侧,空闲的内存被放到另一侧,使用过的内存和空闲内存之间放着一个指针作为分界线,当有内存需要分配时,指针向空闲方向移动与对象大小相等的距离即可,这种分配方式称为"指针碰撞"。

2. 空闲列表

如果堆内存不是规整的,已被使用的内存和空闲的内存相互交错在一起,没办法使用指针碰撞分配空间,JVM会维护一个列表,记录哪些内存块可用,在分配的时候从列表中找到一块足够大的空间划分给对象实例,并更新列表上的记录,这种分配方式称为"空闲列表"(Free List)。

3. TLAB(Thread Local Allocation Buffer)

也称为本地线程分配缓冲,TLAB 是线程私有的,线程初始化的时候,会创建并初始化 TLAB。对象创建在虚拟机中是非常频繁的行为,因此可能存在并发问题,为此提供了两种解决方案。

方案一:内存分配动作同步完成,JVM采用CAS + 自旋的方式。

方案二:为每个线程在Java堆中预先分配一小块内存。哪个线程要分配内存,就在哪个线程的本地缓冲区中分配。

虚拟机是否使用TLAB,可以通过-XX:+/-UseTLAB参数来设定,默认开启。

4. 垃圾回收器如何选择内存分配策略?

新生代基于复制的收集器,采用指针碰撞即简单又高效,老年代基于整理、清除算法的收集器,使用较为复杂的空闲列表来分配内存。


感谢您的阅读!如果文章中有任何问题或不足之处,欢迎及时指出,您的反馈将帮助我不断改进与完善。期待与您共同探讨技术,共同进步!

相关推荐
小白|几秒前
cmake:昇腾CANN构建系统完全指南
java·c++·算法
weixin_512976176 分钟前
Java 面试宝典 Beta5.0
java
Ting-yu9 分钟前
Spring AI Alibaba零基础速成(5) ---- Memory(记忆)
java·人工智能·后端·spring
月落归舟11 分钟前
一文掌握Spring AOP:从入门到底层原理
java·后端·spring
QuZhengRong14 分钟前
【Luck-Report】缓存
java·前端·后端·vue·excel
XiYang-DING26 分钟前
【Spring】SpringMVC
java·后端·spring
想学习java初学者27 分钟前
SpringBoot整合GS1编码解码
java·spring boot·后端
日月云棠28 分钟前
2 快速入门实战指南
java·后端
日月云棠29 分钟前
3 Dubbo 2.7 高级配置:检查控制、版本策略与协议选择
java·后端
砍材农夫35 分钟前
物联网 基于netty构建mqtt协议规范(主题通配符订阅)
java·前端·javascript·物联网·netty