iOS 判断对象是否有属性 判断对象是否存在
转载
- 混淆点 : 引用计数的算法难以解决对象之间的相互循环引用.所以, JAVA 和 C# 都是用根据搜索算法来判断对象是否存活的.
- 算法思路 : 通过一系列的名为 "GCRoot" 的对象作为起始点,从这些节点开始向下搜索,搜索所有走过的路径称为引用链,当一个对象到 CCRoot 没有任何引用链相连时,说明该对象不可用.
- 可以作为 GCRoot 对象有:
- 虚拟栈(栈桢中本地变量表)中引用的对象
- 方法区中的类静态属性引用的对象
- 方法区中常量引用的对象
- 本地方法中 JVI(native 方法)的引用对象
- 强引用
- 软引用 : softReference, 软引用被回收在内存溢出之前
- 弱引用 : weakReference, 弱引用被回收在下一次 GC 回收之前
- 虚引用 : phantomReference
"虚引用"顾名思义,就是形同虚设,与其他几种引用都不同,虚引用并不会决定对象的生命周期。如果一个对象仅持有虚引用,那么它就和没有任何引用一样,在任何时候都可能被垃圾回收。
虚引用主要用来跟踪对象被垃圾回收的活动。虚引用与软引用和弱引用的一个区别在于:虚引用必须和引用队列(ReferenceQueue)联合使用。当垃 圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是 否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。程序如果发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。
特别注意,在程序设计中一般很少使用弱引用与虚引用,使用软引用的情况较多,这是因为软引用可以加速JVM对垃圾内存的回收速度,可以维护系统的运行安全,防止内存溢出(OutOfMemory)等问题的产生。
以下是软引用的代码:
import java.lang.ref.SoftReference;
public class Test {
public static void main(String[] args){
System.out.println("开始");
A a = new A();
SoftReference<A> sr = new SoftReference<A>(a);
a = null;
if(sr!=null){
a = sr.get();
}
else{
a = new A();
sr = new SoftReference<A>(a);
}
System.out.println("结束");
}
}
class A{
int[] a ;
public A(){
a = new int[100000000];
}
}
本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。