6
回答
java 局部变量回收的问题
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

 android中,对象回收是一个很重要的,按照我的理解,局部变量中的生成的对象,应该都能被回收,

但是,全局变量的对象应该会产生垃圾对象,不知道我这样的理解对不对?

 

举报
共有6个答案 最后回答: 2年前
局部变量中对象的创建也是堆内存中,在栈内保存一个对象的引用,也会产生垃圾。如果没有此对象没有任何引用的地方才会被回收。

引用来自“歇蹩虎子”的评论

局部变量中对象的创建也是堆内存中,在栈内保存一个对象的引用,也会产生垃圾。如果没有此对象没有任何引用的地方才会被回收。
既然是局部变量产生对象,离开这个方法后,这个变量就不存在了,那么他所产生的对象也应该被回收。

程序运行时的内存占用,主要是堆和栈,各自的分配和回收法则不一样

先说堆,堆是一大片空间,按需存储,需要的数据按照大小,分配合适的位置来存放,主要参数是偏移量和长度,也就是起始位置和占用大小,共同决定了数据存放的实际位置,回收就是将这一片空间标记为可再分配,而其中的数据并不会丢失,但因为失去了能够理解这些数据的格式定义,所以变得毫无价值,这也就是为什么在C语言中,分配的内存,如果不初始化,会得到一些毫无意义的数据,其实这些数据原来都曾经有过意义,但当某一段程序获得这片空间时,一来无法理解这些数据的原来含义,二来,新分配的空间,跟原来完整的数据空间,基本不可能重合。

再来说栈,栈是一种FILO的数据结构,栈上分配的单元是桢,而且在分配的时候,并没有指定大小,而是在一个线性的内存空间内连续分配,当遇到函数/方法调用时,会封闭顶层桢,创建一个新的桢出来,严格来说,在封闭动作之前,都不能算是完整的桢,就像盖楼一样,一直往上盖,直到接受到指令说要上楼板,在楼板上完之后继续盖。所以,桢没有固定的大小,主要看调用与调用之间产生了多少数据量。桢与桢之间的数据相互隔离,程序中通过变量这一种符号来处理数据,而一旦当前桢封闭了,进入了新的顶层桢,那么,之前桢的数据在新的桢里是无法访问的,这里是数据有特殊含义,指的是桢里面包含的数据,其实就是局部变量了。变量中存放的值,除了基本类型的数据外,就是引用了,而引用的数据是存放在堆里面的,如果在函数调用的时候,把引用传递给下一层函数,比如通过参数传递,这个过程实际上就是复制了一份引用,但原始引用和复制出来的引用指向堆里面的同一个对象。不同的是,在新的调用中访问的,是复制后的引用,原始的引用依然保存在前一个栈桢中,即使你在调用过程中,改变了引用的值,注意是引用的值,也就是引用的指向,而不是改变该引用指向的对象内部的值。那么在改变后,复制后的引用指向发生了变更,但前一个栈桢中保存的原始引用的指向依然不会发生变化。

当一个过程被调用完毕后,它在栈上开辟的空间,也就是桢,也会被销毁,那么所有保存在桢里面的数据都将消失,包括基础数据类型的数据和引用,堆里面的一个对象,如果没有任何引用指向它了,或者若干个对象互相之间存在引用,但总体上形成了一个封闭的有向图,即再也没有任何方式从程序中访问到这些对象,他们变成了对象海洋中的孤岛,统统都会被认为是垃圾对象回收掉。但有一点我们需要注意的是,垃圾对象的判定和回收,是GC的事情,我们无法也没有必要去手工做这件事情。

顶部