堆一般是存放对象的,栈一般是存放方法、变量的。

堆存储的是对象、实体,栈存储的方法参数和局部变量(存储的内容不同)栈是由编译器自动管理,无需手动控制;堆则由程序员控制,如内存区域的申请(new)和释放(release),容易内存泄漏(管理方式的不同)栈空间很小。栈是向低地址扩展的数据结构,是一块连续的内存区域;堆空间较灵活,较大。堆是向高地址扩展的数据结构,是不连续的内存区域(空间大小区别)栈内存的更新速度快于堆内存的更新速度,即栈的效率会更高(更新速度的不同)

内存管理的5大区域:

栈(stack)和堆(heap)都是内存区域的其中两种形式,我们称为栈区和堆区。

堆区

是由程序员分配和释放,用于存放运行中被动态分配的内存段。大小不定,可增加和缩减

栈区

栈是由编译器分配和释放,用于存放程序临时创建的变量、函数的参数、局部变量等。

还有全局区(静态)

全局区是编译时分配的内存空间,在程序运行过程中,此内存中的数据一直存在,程序结束后由系统释放。static修饰的变量始终保存到常量区

用来存放可执行文件中已经初始化的全局变量,也就是用来存放静态分配的变量和全局变量(.data)

而bss段通常是指用来存放程序中未初始化的全局变量和静态变量的一块内存区域。

BSS段在程序执行之前会清0,所以未初始化的全局变量(静态变量)已经是0了。所以这种情况还是存放在BSS段,一旦初始化就会从BSS段中回收掉,转存到data段(数据段)中。

常量区

是编译时分配的内存空间,在程序结束后由系统释放。存放的是常量,是一块特殊的区域

通常是指用来存放程序中已经初始化的全局变量和静态变量的一块内存区域。数据段属于静态内存分配,可以分为只读数据段和读写数据段。字符串常量等,是放在只读数据段中,结束程序时才会被收回。

代码区

用来存放函数的二进制代码,它是可执行程序在内存中的镜像。代码段需要防止在运行时被非法修改,只允许读操作,不允许写操作

栈区是由编译器自动管理的,其操作方式是

后进先出(FIFO),当我们运行一个方法时,方法的参数、方法中的局部变量都会被自动存储在栈区中,当出了作用域后(方法运行结束),这些参数和局部变量就会被释放。-应用中新创建的每个线程都有专用的栈空间。

用一张图总结下这个问题

60e5560401346.png