java堆和栈小结(转)

(1)JAVA中基本数据类型直接存储在栈中,而复合的数据类型采用引用模型,其引用存储在栈中,而对象存储在堆中。 

(2)Java把内存划分成两种:一种是栈内存,一种是堆内存。 

在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配。 

当在一段代码块定义一个变量时,Java就在栈中为这个变量分配内存空间,当超过变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立即被另作他用。堆内存用来存放由new创建的对象和数组。 

在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。 

在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量,让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量。 

引用变量就相当于是为数组或对象起的一个名称,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或对象。 

(3)static存储在方法区中是jvm规范中的术语。 

而方法区是一定在jvm所在的进程所属的堆A中。 

而jvm在堆A中划出一块内存用于存放类信息等数据信息,这块内存 

就叫方法区,某个jvm实现 ? 可以用堆来作为存放这些数据信息的数据结构, 

这时方法区就以堆的形式而存在了。 

(4)目前的jvm中有两种堆(不排除以后合并为一种堆), 

其中一种堆是用于存放由new创建的对象和数组, 

另一种堆是用于存放装载进来的类信息,static变量即存储在这个类信息中。 

 

 

 

Java中对象都是分配在heap(堆)中。从heap中分配内存所消耗的时间远远大于从stack产生存储空间所需的时间。 

(1)每个应用程序运行时,都有属于自己的一段内存空间,用于存放临时变量、参数传递、函数调用时的PC值的保存。这叫stack。 

(2)所有的应用可以从一个系统共用的空间中申请供自己使用的内存,这个共用的空间叫heap。 

(3)stack中的对象或变量只要定义好就可使用了,应用程序结束时会自动释放。 

(4)而要使用heap中申请的变量或对象只能定义变量指针,并要求在运行过程中通过new来动态分配内存空间,而且必须显示地free你申请过的内存,不过Java的垃圾回收机解决了这个问题,它会帮你释放这部分内存。 

(5)stack中变量的大小和个数会影响exe的文件大小,但速度快。堆中的变量大小与exe大小关系不大,但分配和释放需要耗费的时间远大于stack中分配内存所需的时间。 

(6)stack?和?heep??都是内存的一部分 

stack?空间小,速度比较快,?用来放对象的引用 

heep?大,一般所有创建的对象都放在这里 

(7)栈(stack):是一个先进后出的数据结构,通常用于保存方法(函数)中的参数,局部变量. 

在java中,所有基本类型和引用类型都在栈中存储.栈中数据的生存空间一般在当前scopes内(就是由{...}括起来的区域). 

堆(heap):是一个可动态申请的内存空间(其记录空闲内存空间的链表由操作系统维护),C中的malloc语句所产生的内存空间就在堆中. 

在java中,所有使用new?xxx()构造出来的对象都在堆中存储,当垃圾回收器检测到某对象未被引用,则自动销毁该对象.所以,理论上说java中对象的生存空间是没有限制的,只要有引用类型指向它,则它就可以在任意地方被使用

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值