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

Java内存的堆(堆内、堆外)、栈含义理解笔记

一、核心概念区分

1. 内存中的堆(Heap)与栈(Stack)

  • 栈内存
    用途:存储方法调用、局部变量、基本类型数据(如 int a = 1
    特点
    • 线程私有,每个线程独立分配栈空间。
    • 自动分配和释放(编译时确定),遵循 LIFO(后进先出)原则。
    • 容量小且固定,易发生栈溢出(如无限递归导致 StackOverflowError
  • 堆内存
    用途:存储对象实例、数组等引用类型数据(如 new Object()
    特点
    • 全局共享,所有线程可访问。
    • 动态分配和释放(运行时决定),由垃圾回收器(GC)自动管理。
    • 容量大但管理复杂,可能引发内存碎片或 OutOfMemoryError

示例

java
public void example() {
int num = 10; // num存储在栈中(基本类型)
Object obj = new Object(); // obj引用在栈中,实际对象在堆中
}

 

2. 堆内内存(On-Heap)与堆外内存(Off-Heap)

  • 堆内内存
    定义:由 JVM 托管的堆内存,存储所有 Java 对象(如 StringList
    优点:自动内存管理,安全性高(避免内存泄漏)。
    缺点:GC 可能导致性能波动(如 Full GC 暂停)
  • 堆外内存
    定义:JVM 堆外的直接内存,由操作系统管理(如 ByteBuffer.allocateDirect()
    优点
    • 减少 GC 开销,适合高频 I/O 操作(如 Netty 网络框架)。
    • 可突破 JVM 堆内存限制,存储大规模数据。
      缺点:需手动释放(否则内存泄漏),编程复杂度高

示例
 

java
// 分配堆外内存(1KB)
ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
// 使用后需手动释放(或依赖 Cleaner 机制)
((sun.nio.ch.DirectBuffer) buffer).cleaner().clean();

二、对比与典型场景

1. 堆、栈、堆外内存对比

维度

栈内存

堆内内存

堆外内存

存储内容

方法调用、基本类型变量

对象实例、数组

直接内存(如 I/O 缓冲区)

管理方式

自动分配/释放(编译器)

自动 GC 管理

手动分配/释放

线程隔离性

线程私有

全局共享

全局共享

性能

极快(无需 GC)

较慢(受 GC 影响)

快(绕过 JVM 堆)

容量限制

小(默认几 MB)

大(受 JVM 参数限制)

极大(受物理内存限制)

2. 应用场景

  • 栈内存:高频方法调用、临时变量(如循环计数器)
  • 堆内内存:常规业务对象(如用户信息、订单数据)
  • 堆外内存
    • 高频网络数据传输(如 Kafka 消息缓冲区)
    • 大数据处理(避免 JVM 堆内存不足)

三、常见问题

1. 为何堆外内存能提升性能?

堆外内存绕过了 JVM 堆,数据可直接被操作系统或硬件访问,避免了数据在 JVM 堆与系统内存之间的复制开销(如 FileChannel 直接读写文件)

2. 堆外内存泄漏如何排查?

  • 工具:使用 jcmd 或 NMT(Native Memory Tracking)监控
  • 代码规范:确保调用 clean() 或使用 try-with-resources 管理资源

总结

  • :轻量级临时数据存储,线程安全但容量有限。
  • :对象生命周期管理,依赖 GC 但易用性高。
  • 堆外:高性能场景的扩展方案,需谨慎管理。
    实际开发中需根据数据特性和性能需求选择合适的内存区域。

 


http://www.kler.cn/a/565365.html

相关文章:

  • 端口映射/内网穿透方式及问题解决:warning: remote port forwarding failed for listen port
  • 机器学习(模型的保存和加载)
  • 【版本控制安全简报】Perforce Helix Core安全更新:漏洞修复与国内用户支持
  • nginx 动态计算拦截非法访问ip
  • 【Linux】ubuntu server扩容硬盘
  • 树莓百度百科更新!宜宾园区业务再添新篇
  • 【Python爬虫(96)】从0到1:打造爬虫驱动的数据分析平台
  • 联想 SR590 服务器 530-8i RAID 控制器更换损坏的硬盘
  • 以太坊测试网
  • YOLOv8+QT搭建目标检测项目
  • ruoyi vue el-elementui el-tree 自适应宽度向左浮动
  • 从扫描到建模:盎锐UCL360PRO如何实现隧道的数字化重建运维
  • MinIO整合SpringBoot实现文件上传、下载
  • 服务器广播需要广播的服务器数量
  • DOM 事件 HTML 标签属性速查手册
  • 【无监督学习】主成分分析步骤及matlab实现
  • MySQL数据库入门到大蛇尚硅谷宋红康老师笔记 高级篇 part 4
  • 神经网络 - 激活函数(ReLU 函数)
  • 第12章_管理令牌和会话
  • AORO M6北斗短报文终端:将“太空黑科技”转化为安全保障