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. 垃圾回收器如何选择内存分配策略?

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


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

相关推荐
speop4 分钟前
TASK05【Datawhale 组队学习】系统评估与优化
android·java·学习
星沁城7 分钟前
108. 将有序数组转换为二叉搜索树
java·数据结构·leetcode
在未来等你36 分钟前
互联网大厂Java求职面试:云原生架构与AI应用集成解决方案
java·spring cloud·微服务·ai·云原生·kubernetes·大模型
向哆哆39 分钟前
Java 依赖管理工具:使用 Sonatype Nexus 管理项目依赖
java·开发语言
Uranus^1 小时前
深入解析Spring Boot与Spring Cloud在微服务架构中的实践与应用
java·spring boot·spring cloud·微服务·分布式系统
陈天伟教授1 小时前
Web前端开发 - 制作简单的焦点图效果
java·开发语言·前端·前端开发·visual studio
不吃肘击2 小时前
MyBatisPlus使用教程
java·开发语言
一刀到底2112 小时前
spring+tomcat 用户每次发请求,tomcat 站在线程的角度是如何处理用户请求的,spinrg的bean 是共享的吗
java·spring·tomcat
Master-Tang2 小时前
Spring Boot + MyBatis-Plus实现操作日志记录
java
Ricoh.2 小时前
打破双亲委派模型的实践:JDBC与Tomcat的深度解析
java·tomcat