学习--Java中堆内存和栈内存详解

本文参考:https://www.cnblogs.com/whgw/archive/2011/09/29/2194997.html 总结

  • 1、标题Java 把内存分成两种,一种叫做栈内存,一种叫做堆内存

  • 在函数中定义的 一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。
    • 当在一段代码块中定义一个变量时,java 就在栈中为这个变量分配内存空间,当超过变量的作用域后(如变量定义的函数执行结束),java 会自动释放掉为该变量分配的栈内存空间,该内存空间可以立刻被另作他用。
  • 堆内存用于存放由 new 创建的对象和数组。
    • 在堆中分配的内存,由 java 虚拟机自动垃圾回收器来管理。在堆中产生了一个数组或者对象后,还可以在栈中定义一个特殊的变量,这个变量的取值等于数组或者对象在堆内存中的首地址,在栈中的这个特殊的变量就变成了数组或者对象的引用变量,以后就可以在程序中使用栈内存中的引用变量来访问堆中的数组或者对象,引用变量相当于为数组或者对象起的一个别
      名,或者代号。
  • 引用变量是普通变量,定义时在栈中分配内存,引用变量在程序运
    行到作用域外释放。
    • 此时释放的是栈中的引用变量占用的内存,而堆中分配的对象或者数组内存不会释放(需要该对象或者数组已没有引用变量指向,才会由垃圾回收器择机回收)
2、标题java 中内存分配策略及堆和栈的比较
  • a. 内存分配策略
    • 程序运行时的内存分配有三种策略,分别是 静态的,栈式的,和堆式的
      • 静态存储分配 指在编译时就能确定每个数据目标在运行时刻的存储空间需求。
        • 这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为它们都会导致编译程序无法计算准确的存储空间需求.
      • 栈式存储分配 也可称为动态存储分配,是由一个类似于堆栈的运行栈来实现的。
        • 程序对数据区的需求只有到运行的时候才能够知道,但是规定在运行中进入一个程序模块时,必须知道该程序模块所需的数据区大小才能够为其分配内存
      • 堆式存储分配 专门负责在编译时或运行时模块入口处都无法确定存储要求的数据结构的内存分配,比如可变长度串和对象实例。
        • 堆由大片的可利用块或空闲块组成,堆中的内存可以按照任意顺序分配和释放.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值