栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

java 对象的生命周期

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

java 对象的生命周期

JDK中的 对象生命周期概念
    • 简单来说就是 Object obj = null 清理对象
    • 复杂来说
      • 1. Reference
      • 2.PhantomReference
      • 3. FinalReference(private 级、想操作可以com.google.common.base.internal包下的Finalizer )
      • 4. SoftReference
      • 5. WeakReference
    • 代码的实际应用

简单来说就是 Object obj = null 清理对象 复杂来说

内容范围:

1. Reference
这个抽象类,是引用对象的抽象基类。定义了所有引用对象共同的操作,引用对象与垃圾收集器密切配合实现,所以该类可能不会被直接子类化。 
public abstract class Reference {...}

内部结构:

2.PhantomReference
在收集者确定其指示物可能被回收之后排入队列的Phantom引用对象。 幻像(虚)引用最常用于以比Java完成机制可能更灵活的方式安排事先清理操作。 

如果垃圾收集器在某个时间点确定幻像引用的引用是phantom reachable ,那么在那个时间或稍后的时间,它将引入引用。 

为了确保可回收对象保持原样,可能无法检索幻像引用的引用:虚幻引用的get方法始终返回null 。 
与软弱引用不同,幻像引用在垃圾收集器排入队列时不会自动清除。 通过幻影引用可访问的对象将一直保持到所有这样的引用被清除或者自身变得不可访问。
public class PhantomReference extends Reference{...}

内部结构:

3. FinalReference(private 级、想操作可以com.google.common.base.internal包下的Finalizer )
 Package-private; must be in  same package as the Reference  class
最终引用,用于实现终结
class FinalReference extends Reference {}

此 final 子类
final class Finalizer extends FinalReference {}

 

内部结构:

4. SoftReference
软引用对象,由垃圾收集器根据内存需求自行清除。 软引用通常用于实现内存敏感缓存。 
假设垃圾收集器在某个时间点确定对象是softly reachable 。 那时候,它可能会选择原子地清除对该对象的所有软引用,以及对任何其他可轻松访问的对象的所有软引用,该对象可以通过一个强引用链来访问该对象。 在同一时间或稍后的时间,它将排入在引用队列中注册的新清除的软引用。 

在虚拟机抛出OutOfMemoryError之前,所有软引用对象可以保证被清除。 否则,在清除软引用的时间或者对一组对不同对象的引用将被清除的顺序没有约束。 但是,鼓励虚拟机实现偏离清除最近创建或最近使用的软引用。 

此类的直接实例可用于实现简单的缓存; 此类或派生子类也可用于较大的数据结构以实现更复杂的高速缓存。 只要软引用的指示是强有力的,即实际使用中,软参考将不会被清除。 因此,复杂的缓存可以例如阻止其最近使用的条目被丢弃,通过保持对这些条目的强烈的指示,使剩余的条目由垃圾收集器判断丢弃。
public class SoftReference extends Reference {...}

内部结构:

5. WeakReference
弱参考对象,不会阻止其指定对象的最终确定,最终确定,然后被回收。 弱引用最常用于实现规范化映射。 
假设垃圾收集器在某个时间点确定对象是weakly reachable 。 那时,它将原子地清除对该对象的所有弱引用,以及所有弱引用到任何其他弱可触及的对象,通过一连串强软引用可以从该对象到达该对象。 同时,它将声明所有以前弱可触及的对象都是可以确定的。 在同一时间或稍后的时间,它将排列在引用队列中注册的新清除的弱引用。
public class WeakReference extends Reference {...}

内部结构:

代码的实际应用

这里就直接贴个测试代码,看大家领悟了…

		// todo  这个是list集合中运用,可用于定时跑一些大数据量的数据操作
 		ArrayList objects = new ArrayList<>(3);
        ArrayList> objects2 = new ArrayList<>(4);
        WeakReference> aWeakReference = new WeakReference<>(objects);
        objects2.add(aWeakReference.get());
        System.out.println("------------ ^ -------------");
        objects2.stream().forEach(System.out::println);

        A a = new A();
        A a1 = new A();
        A a2= new A();
        objects.add( a);
        objects.add( a1);
        objects.add( a2);

        System.out.println("------------ ^ -------------");
        objects.forEach(System.out::println);
        System.out.println("-------------------------");
        objects2.forEach(it -> {
            it.forEach(System.out::println);
        });
        System.out.println("-------------------------");
        aWeakReference.get().forEach(System.out::println);
        System.out.println("-------------------------");

        System.out.println("------------ clean -------------");
        objects.clear();

        System.gc();;

        objects.forEach(System.out::println);
        System.out.println("-------------------------");
        objects2.forEach(it -> {
            it.forEach(System.out::println);
        });
        System.out.println("-------------------------");
        aWeakReference.get().forEach(System.out::println);
        System.out.println("-------------------------");
		// todo  上面同下,再来个Map、 List组合应用
		HashMap objects = new HashMap(3);
        ArrayList> objects2 = new ArrayList<>(4);
        WeakReference> aWeakReference = new WeakReference<>(objects);
        objects2.add(aWeakReference.get());
        objects2.stream().forEach(item -> {
            item.forEach((k, v) -> System.out.println(k + " : " + v));
        });
        System.out.println("------------ ^ -------------");


        A a = new A();
        A a1 = new A();
        A a2= new A();
        objects.put(1, a);
        objects.put(2, a1);
        objects.put(3, a2);


        objects.forEach((k, v) -> System.out.println(k + " : " + v));
        System.out.println("-------------------------");
        objects2.stream().forEach(item -> {
            item.forEach((k, v) -> System.out.println(k + " : " + v));
        });
        System.out.println("-------------------------");
        aWeakReference.get().forEach((k, v) -> System.out.println(k + " : " + v));
        System.out.println("-------------------------");

        System.out.println("------------ clean -------------");
        objects.clear();

        System.gc();;

        objects.forEach((k, v) -> System.out.println(k + " : " + v));
        System.out.println("-------------------------");
        objects2.stream().forEach(item -> {
            item.forEach((k, v) -> System.out.println(k + " : " + v));
        });
        System.out.println("-------------------------");
        aWeakReference.get().forEach((k, v) -> System.out.println(k + " : " + v));
        System.out.println("-------------------------");

这一行,争渡争渡

转载请注明:文章转载自 www.mshxw.com
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号