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

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


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

相关推荐
Carve_the_Code20 分钟前
分布式订单系统:订单号编码设计实战
java·后端
Home21 分钟前
23种设计模式之代理模式(结构型模式二)
java·后端
程序员西西23 分钟前
详细介绍Spring Boot中用到的JSON序列化技术?
java·后端
雨中飘荡的记忆23 分钟前
MySQL 优化实战
java·mysql
豆豆的java之旅26 分钟前
深入浅出Activity工作流:从理论到实践,让业务流转自动化
java·运维·自动化·activity·工作流
一点 内容33 分钟前
深度解析OurBMC后端模式:全栈技术架构与运维实践
java·开发语言
q***235734 分钟前
MySQL 篇 - Java 连接 MySQL 数据库并实现数据交互
java·数据库·mysql
合方圆~小文41 分钟前
球型摄像机作为现代监控系统的核心设备
java·数据库·c++·人工智能
椎4951 小时前
苍穹外卖资源点整理+个人错误解析-Day10-订单状态定时处理(Spring Task)、来单提醒和客户催单
java·后端·spring
Y***h1871 小时前
eclipse配置Spring
java·spring·eclipse