对象已死?


我们怎么判断对象是否已经死亡呢?

引用计数算法

在这里插入图片描述
算法的优点
使用引用计数器,内存回收可以穿插在程序的运行中,在程序运行中,当发现某一对象的引用计数器为0时,可以立即对该对象所占用的内存空间进行回收,这种方式可以避免FULL GC时带来的程序暂停

算法的劣势
采用引用计数器进行垃圾回收,最大的缺点就是不能解决循环引用的问题,例如一个父对象持有一个子对象的引用,子对象也持有父对象的引用,这种情况下,父子对象将一直存在于JVM的堆中,无法进行回收,如图所示:
在这里插入图片描述

根搜索算法

在这里插入图片描述
在这里插入图片描述

引用

在这里插入图片描述

  • 强引用
    在这里插入图片描述

  • 软引用
    在这里插入图片描述
    在这里插入图片描述

    Object obj = new Object();
    SoftReference<Object> softRef = new SoftReference<Object>(obj);
    System.out.println(obj);
    System.out.println(softRef.get());
    // 对象通过设置为null让对象失去引用,方便GC
    obj = null;
    // 当内存不足时,会自动触发GC操作,这里就无需手动GC
    try {
        byte[] b = new byte[30 * 1024 * 1024];
    } catch (Exception e) {} 
    finally {
        System.out.println(obj);
        System.out.println(softRef.get());
    }
    
  • 弱引用
    在这里插入图片描述

    Object obj = new Object();
    WeakReference<Object> weakRef = new WeakReference<Object>(obj);
    System.out.println(obj);            // java.lang.Object@7852e922
    System.out.println(weakRef.get());    // java.lang.Object@7852e922
    // 对象通过设置为null让对象失去引用,方便GC
    obj = null;
    // 这里通过手动触发GC操作。否则内存充足的情况下很难自动触发GC
    System.gc();
    System.out.println(obj);            // null
    System.out.println(weakRef.get());    // null
    
  • 虚引用
    在这里插入图片描述
    换句话说,设置虚引用关联的唯一目的,就是在这个对象被收集器回收的时候收到一个系统通知或者后续添加进一步的处理。Java技术允许使用finalize()方法在垃圾收集器将对象从内存中清除之前做必要的清理工作

    Object obj = new Object();
    ReferenceQueue<String> queue = new ReferenceQueue<String>();  
    PhantomReference<String> pr = new PhantomReference<String>(obj, queue);  
    System.out.println(pr.get());  // null
    
  • 引用队列
    引用队列可以配合软引用、弱引用及幽灵引用使用,当引用的对象将要被JVM回收时,会将其加入到引用队列中。通过引用队列可以了解JVM垃圾回收情况

    // 引用队列
    ReferenceQueue<String> rq = new ReferenceQueue<String>();
    // 软引用
    SoftReference<String> sr = new SoftReference<String>(new String("Soft"), rq);
    // 弱引用
    WeakReference<String> wr = new WeakReference<String>(new String("Weak"), rq);
    // 幽灵引用
    PhantomReference<String> pr = new PhantomReference<String>(new String("Phantom"), rq);
    // 从引用队列中弹出一个对象引用
    Reference<? extends String> ref = rq.poll();
    

finalize()方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

回收方法区

方法区其实也是需要被回收的,并不是说虚拟机永久代中不需要垃圾收集。而是方法区中的垃圾收集的效率很低,新生代中一次垃圾收集可以回收70%-95%的空间,而永久代中的下效率要远远低于此。
方法区中的回收主要包括两部分内容:废弃的常量和无用的类

  • 废弃的常量主要包括两大类 字面量和符号引用
    字面量比较接近Java语言中的常量概念。回收废弃的常量和回收Java堆中的对象类似,如:要回收字符串“s”,当系统中没有任何String类型的对象引用常量池中的"s"时,也没有其他地方引用这个字面量,如果发生内存回收,而且有必要的话,则会将该字符串清理出常量池中。其中包括文本字符串、被声明为final的常量值等 而符号引用属于编译方面的概念。常量池中的其他类、接口、方法、字段的符号引用也与此类似,包括
    1.类和接口的全限定名
    2.字段的名称和描述符
    3.方法的名称和描述符

  • 无用的类: 要判断一个无用的类的条件非常的苛刻,需要满足:
    1.该类的所有实例都被回收,即:Java堆中不存在该类的任何实例
    2.该类的Classloader已经被回收
    3.该类对用的java.lang.Class对象没有任何地方被引用,无法在任何地方通过反射访问到该类的方法。
    当满足以上三个条件时,也未必说是一定要被回收。也仅仅是可以。
    在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的体育馆管理系统,源码+数据库+毕业论文+视频演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本体育馆管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此体育馆管理系统利用当下成熟完善的SpringBoot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的Mysql数据库进行程序开发。实现了用户在线选择试题并完成答题,在线查看考核分数。管理员管理收货地址管理、购物车管理、场地管理、场地订单管理、字典管理、赛事管理、赛事收藏管理、赛事评价管理、赛事订单管理、商品管理、商品收藏管理、商品评价管理、商品订单管理、用户管理、管理员管理等功能。体育馆管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:体育馆管理系统;SpringBoot框架;Mysql;自动化
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值