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

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


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

相关推荐
维天说2 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
Zane19942 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端
噢,我明白了3 小时前
java中Excel的导入和导出(EasyExcel)
java·开发语言·excel
吠品3 小时前
Zabbix Web界面误报Server未运行的排查与解决
java·服务器·数据库
啊湘3 小时前
天气查询API接口 按月Token鉴权 实时天气 物联网可用 文档齐全
java·后端·struts
Java内核笔记4 小时前
告别十亿美元的错误 : Spring Boot 4 空安全 (JSpecify) 实战
java·spring boot·后端
糖果店的幽灵4 小时前
langgraph的 MessagesState 解读
java·开发语言·人工智能·windows·langgraph
极光代码工作室5 小时前
基于SpringBoot的在线博客系统
java·springboot·web开发·后端开发
我是唐青枫5 小时前
Java Spring Security 实战详解:从登录认证到 JWT 权限控制
java·spring
ihuyigui6 小时前
海外签收通知短信接口
android·java·开发语言·前端·数据库·后端