• 内存中的栈空间与堆空间

https://www.jiuzhang.com/tutorial/algorithm/352

我们通常所说的内存空间,包含了两个部分:栈空间(Stack space)和堆空间(Heap space)

当一个程序在执行的时候,操作系统为了让进程可以使用一些固定的不被其他进程侵占的空间用于进行函数调用,递归等操作,会开辟一个固定大小的空间(比如 8M)给一个进程使用。这个空间不会太大,否则内存的利用率就很低。这个空间就是我们说的栈空间,Stack space。

我们通常所说的栈溢出(Stack Overflow)是指在函数调用,或者递归调用的时候,开辟了过多的内存,超过了操作系统余留的那个很小的固定空间导致的。那么哪些部分的空间会被纳入栈空间呢?栈空间主要包含如下几个部分:

  1. 函数的参数与返回值
  2. 函数的局部变量

我们来看下面的这段代码:

public int f(int n) {int[] nums = new int[n];int sum = 0;for (int i = 0; i < n; i++) {nums[i] = i;sum += i;}return sum;
}

根据我们的定义,参数 n,最后的函数返回值f,局部变量 sum 都很容易的可以确认是放在栈空间里的。那么主要的难点在 nums。

这里 nums 可以理解为两个部分:

  1. 一个名字叫做 nums 的局部变量,他存储了指向内存空间的一个地址(Reference),这个地址也就是 4 个字节(32位地总线的计算机,地址大小为 4 字节)
  2. new 出来的,一共有 n 个位置的整数数组,int[n]。一共有 4 * n 个字节。

这里 nums 这个变量本身,是存储在栈空间的,因为他是一个局部变量。但是 nums 里存储的 n 个整数,是存储在堆空间里的,Heap space。他并不占用栈空间,并不会导致栈溢出。

在大多数的编程语言中,特别是 Java, Python 这样的语言中,万物皆对象,基本上每个变量都包含了变量自己和变量所指向的内存空间两个部分的逻辑含义。

来看这个例子:

public int[] copy(int[] nums) {int[] arr = new int[nums.length];for (int i = 0; i < nums.length; i++) {arr[i] = nums[i]}return arr;
}public void main() {int[] nums = new int[10];nums[0] = 1;int[] new_nums = copy(nums);
}

在 copy 这个函数中,arr 是一个局部变量,他在 copy 函数执行结束之后就会被销毁。但是里面 new 出来的新数组并不会被销毁。
这样,在 main 函数里,new_nums 里才会有被复制后的数组。所以可以发现一个特点:

栈空间里存储的内容,会在函数执行结束的时候被撤回

简而言之可以这么区别栈空间和堆空间:

new 出来的就放在堆空间,其他都是栈空间

内存中的栈空间与堆空间相关推荐

  1. 解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法

    堆区:专门用来保存对象的实例(new 创建的对象和数组),实际上也只是保存对象实例的属性值,属性的类型和对象本身的类型标记等,并不保存对象的方法(方法是指令,保存在Stack中) 1.存储的全部是对象 ...

  2. 解释内存中的栈、堆、静态区

    ①通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是方法调用的现场保存都使用内存中的栈空间. ②通过new关键字和构造器创建的对象都放在堆空间. ③程序中的字面量,比如直接写的100.&qu ...

  3. 常见Java面试题之解释内存中的栈、堆和静态区用法

    栈(stack).堆(heap)和静态区(static area)的用法区别 * 通常我们定义一个基本数据类型的变量,一个对象的引用,还有就是函数调用的现场保存都使用内存中的栈空间: * 通过new关 ...

  4. 栈空间和堆空间的区别

    栈空间用于存储函数参数和局部变量,所需空间由系统自动分配,回收也由系统管理,无需人工干预:堆空间用于存储动态分配的内存块,分配和释放空间均由程序员控制,有可能产生内存泄漏. 栈空间作为一个严格后进先出 ...

  5. Java - 解释内存中的栈(stack)、堆(heap)和静态区(static area)的用法

    分享一个大牛的人工智能教程.零基础!通俗易懂!风趣幽默!希望你也加入到人工智能的队伍中来!请点击http://www.captainbed.net 通常我们定义一个基本数据类型的变量,一个对象的引用, ...

  6. C语言面试题--已知整形变量在内存中占4个字节的空间,现有一无符号整形变量a = 0x20190125,请编写函数求出变量a所占内存每个字节的值是多少?

    已知整形变量在内存中占4个字节的空间,现有一无符号整形变量a = 0x20190125,请编写函数求出变量a所占内存每个字节的值是多少? 用共用体方法:共用体内的空间是公用的,每一个成员都可以访问共用 ...

  7. 如何给女朋友讲明白:Java中Stack(栈)与Heap(堆)

    背景 Java中Stack(栈)与Heap(堆)是面试中被经常问到的一个话题. 有没有对Java中Stack(栈)与Heap(堆)烂熟于心的童鞋,请举手!!!(怎么没人举手-) 这个时候蜗牛哥的对象弱 ...

  8. C语言内存分布图----栈空间、堆空间

    内存布局:栈,堆,BSS段(静态区),代码段,数据段 什么是代码区.常量区.静态区(全局区).堆区.栈区? C/C++堆区.栈区.常量区.静态数据区.代码区详解 ------------------- ...

  9. java内存中的栈、方法区 、堆

    栈(stack):主要保存基本类型(或者叫内置类型)(char.byte.short.int.long.double.float.boolean)和对象的引用,数据可以共享,速度仅次于寄存器(regi ...

最新文章

  1. 【Luogu4512】多项式除法(FFT)
  2. python官网下载步骤2019-Python IDE开发工具下载
  3. Tensorflow yolov3 Intel Realsense D435 多进程multiprocessing线程池pool识别时间测试
  4. 运维开发学go还是python_运维工程师是要学python还是学go那?
  5. ftp.listfiles()卡住,不报错
  6. Docker-Compose 一键部署Ningx+.Net Core+Redis集群
  7. 延长汽车使用寿命,抛弃六大用车坏习惯
  8. mysql5.5主从复制总结
  9. c语言system title,system() – C语言库函数
  10. 在html中怎样加表格斜线表头,如何在Word表格中插入斜线
  11. 互联网日报 | 1月27日 星期三 | 支付宝集五福活动2月1日开启;华为否认“出售手机业务”传闻;中国联通自有手机品牌发布...
  12. excel无法加密保存在HTML,如何excel加密后另存为后无需再输入密码/excel加密文件怎么解密?...
  13. 小波变换第2讲:尺度函数与小波函数
  14. 哀悼日 网页置灰兼容ie 亲测有效!
  15. 200821-阿里云服务器ECS学生使用经验小节(非CS折腾了大半天)
  16. pandas筛选数据_2_条件筛选
  17. Spark学习痛点和路线图
  18. Unity3d C# 实现纯鼠标平滑控制场景摄像头(相机)实现自由旋转、移动和围绕节点移动旋转等功能(含源码工程)
  19. 陈南峰质量讲堂3 | 质量工具方法之间的关系
  20. 编程图记(2): 学用PHP框架Laravel

热门文章

  1. 力扣190.颠倒二进制数
  2. mysql的order by,group by和distinct优化
  3. 实现多线程的几种方式
  4. android 透明状态栏方法及其适配键盘上推(一)
  5. css3学习下...
  6. js中元素(图片)切换和隐藏显示问题
  7. 求csdn博客优良编辑方法
  8. 如何使用libgdx编写一个简单的游戏(一)— 雏形
  9. 大白话说Java反射:入门、使用、原理,BAT 面试官 如何面试
  10. (转)Spring Boot (十三): Spring Boot 小技巧