当前位置: 首页 > news >正文

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

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


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

相关文章:

  • spring cloud 服务注册与发现(Service registration and discovery)
  • 常见算法的总结与实现思路
  • Flutter 学习之旅 之 flutter 作为 module ,在 Android 的界面中嵌入Flutter界面功能的简单整理
  • 研究:大模型输出一致性:确定性与随机性的场景化平衡
  • 【Spark入门】Spark架构解析:组件与运行机制深度剖析
  • IP SSL证书常见问题:快速实现HTTPS加密
  • 【前端】【面试】如何实现图片渐进式加载?有几种方法
  • 根据模板语法生成和导出Word文档的工具类
  • 【优选算法 | 二分查找】二分查找算法解析:如何通过二段性优化搜索效率
  • TensorRT详解
  • 练习普通话,说话更有节奏
  • Matplotlib可视化基础
  • Transformer 原理逐行解析:从 Self-Attention 到 Positional Encoding
  • DeepSeek-R1技术报告(中文版)
  • 质量的“试金石”:精通Spring Boot单元测试与集成测试
  • 简单理解https与http
  • GESP2024年9月认证C++八级( 第二部分判断题(6-10))
  • WSL释放空间
  • JavaScript性能优化实战(6):网络请求与资源加载优化
  • 【刷题Day29】Python/JAVA - 03(浅)
  • 光明网评论员:手机“二次放号”,需要重新确认“你是你”
  • 中国黄金协会:一季度我国黄金产量同比增1.49%,黄金消费量同比降5.96%
  • 周口一乡镇公务员“被老赖”,两年4场官司均败诉,市监局将线索移送公安厅
  • 怎样更加贴近中国消费者,运动品牌给出“本地化”选择
  • 2025年上海空间信息大会举行,重大项目集中签约
  • 俄外长拉夫罗夫将出席金砖国家外长会