Java中堆内存和栈内存详解

Java中堆内存和栈内存详解

ID:38981799

大小:1.49 MB

页数:5页

时间:2019-06-22

Java中堆内存和栈内存详解_第1页
Java中堆内存和栈内存详解_第2页
Java中堆内存和栈内存详解_第3页
Java中堆内存和栈内存详解_第4页
Java中堆内存和栈内存详解_第5页
资源描述:

《Java中堆内存和栈内存详解》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、Java中堆内存和栈内存详解Java把内存分成两种,一种叫栈内存,一种叫堆内存。当某一个函数被调用时,这个函数会在栈内存里面申请一片空间,以后在这个函数内部定义的变量,都会分配到这个函数所申请到的栈空间。当函数运行结束时,分配给函数的栈空间被收回。在这个函数中被定义的变量也随之被释放和消失。通过new产生的数组和对象分配在堆内存中。堆内存中分配的内存,由JVM提供的GC(垃圾回收机制)来管理。在堆内存中产生了一个数组对象后,我们还可以在栈中定义一个变量,这个战中变量的取值等于堆中对象的首地址。栈内存中的变量

2、就成了堆内存中数组或者对象的引用变量。我们以后就可以在程序中直接使用栈中的这个变量来访问我们在堆中分配的数组或者对象,引用变量相当于数组或者对象起的一个别名,或者代号。引用变量是一个普通的变量,定义时在栈中分配;引用变量在被运行到它的作用域之外时就被释放,而我们的数组和对象本身是在堆中分配的,即使程序运行到使用new产生对象的语句所在的函数或者代码之后,我们刚才被产生的数组和对象也不会被释放。数组和对象只是在没有引用变量指向它,也就是没有任何引用变量的值等于它的首地址,它才会变成垃圾不会被使用,但是它任然占

3、据着内存空间不放(这也就是我们Java比较吃内存的一个原因),在随后一个不确定的时间被垃圾回收器收走。实际上,栈中的变量指向堆内存中的变量,这就是Java中的指针!publicclassArrayTest{publicstaticvoidmain(String[]args){intx[]=newint[100];intsum=0;for(inti=0;i<100;i++){sum+=x[i];}}}我们可以intx[]=newint[100];分成两部分来写:intx[];和x=newint[100];。第

4、一部分相当于定义了一个普通的变量,只是这个变量中存放的数据是堆中某个对象的首地址。接着我们使用,这一句是在堆内存中产生了一个有100个元素整数类型的数组。当一个对象被创建时,会对其中各种类型的成员变量自动进行初始化赋值。除了基本数据类型之外的变量都是应用类型。Personp1=newPerson();执行完后的内存状态创建新的对象之后,我们就可以使用“对象名.对象成员”的格式,来访问对象的成员(包括属性和方法)。publicclassPerson{intage;voidshout(){System.out.

5、println(age);}publicstaticvoidmain(String[]args){Personp1=newPerson();Personp2=newPerson();p1.age=30;p1.shout();p2.shout();}}上面程序运行的内存布局如下图:Java中内存分配策略及堆和栈的比较1、内存分配策略按照编译原理的观点,程序运行时的内存分配有三种原则,分别是静态的,栈式的,和堆式的。静态存储分配时指在编译时就能确定每个数据目标在运行时刻的存储空间需求,因而在编译时就可以给他们分

6、配固定的内存空间。这种分配策略要求程序代码中不允许有可变数据结构(比如可变数组)的存在,也不允许有嵌套或者递归的结构出现,因为他们都会导致编译程序无法计算准确的存储空间需求。

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。