当前位置: 首页 > news >正文

免费网站域名申请建网站的小软件

免费网站域名申请,建网站的小软件,海尔网站建设的缺点,宁波市建筑业管理信息网本篇文章我们详细介绍Java中对象的finalization机制,以及怎么使用finalize()方法,将即将被回收的对象,拉回来。1、finalization机制Java语言提供了对象终止(finalization)机制来允许开发人员提供对象被销毁之前的自定义…

本篇文章我们详细介绍Java中对象的finalization机制,以及怎么使用finalize()方法,将即将被回收的对象,拉回来。

1、finalization机制

Java语言提供了对象终止(finalization)机制来允许开发人员提供对象被销毁之前的自定义处理逻辑。

当垃圾回收器发现没有引用指向一个对象,即:垃圾回收此对象之前,总会先调用这个对象的finalize()方法。

finalize() 方法允许在子类中被重写,用于在对象被回收时进行资源释放。通常在这个方法中进行一些资源释放和清理的工作,比如关闭文件、套接字和数据库连接等。

永远不要主动调用某个对象的finalize()方法,应该交给垃圾回收机制调用。理由包括下面三点:

  • 在finalize()时可能会导致对象复活。

  • finalize()方法的执行时间是没有保障的,它完全由GC线程决定,极端情况下,若不发生GC,则finalize()方法将没有执行机会。

  • 一个糟糕的finalize()会严重影响GC的性能(finalize方法中有死循环等)。

从功能上来说,finalize()方法与C中的析构函数比较相似,但是Java采用的是基于垃圾回收器的自动内存管理机制,所以finalize()方法在本质上不同于C中的析构函数。

由于finalize()方法的存在,虚拟机中的对象一般处于三种可能的状态。

如果从所有的根节点都无法访问到某个对象,说明对象己经不再使用了。一般来说,此对象需要被回收。但事实上,也并非是“非死不可”的,这时候它们暂时处于“缓刑”阶段。一个无法触及的对象有可能在某一个条件下“复活”自己,如果这样,那么对它的回收就是不合理的,为此,定义虚拟机中的对象可能的三种状态。如下:

  • 可触及的:从根节点开始,可以到达这个对象。

  • 可复活的:对象的所有引用都被释放,但是对象有可能在finalize()中复活。

  • 不可触及的:对象的finalize()被调用,并且没有复活,那么就会进入不可触及状态。不可触及的对象不可能被复活,因为finalize()只会被调用一次。

以上3种状态中,是由于finalize()方法的存在,进行的区分。只有在对象不可触及时才可以被回收。

具体过程

判定一个对象objA是否可回收,至少要经历两次标记过程:

①、如果对象objA到GC Roots没有引用链,则进行第一次标记。

②、进行筛选,判断此对象是否有必要执行finalize()方法

③、如果对象objA没有重写finalize()方法,或者finalize()方法已经被虚拟机调用过,则虚拟机视为“没有必要执行”,objA被判定为不可触及的。

④、如果对象objA重写了finalize()方法,且还未执行过,那么objA会被插入到F-Queue队列中,由一个虚拟机自动创建的、低优先级的Finalizer线程触发其finalize()方法执行。

⑥、finalize()方法是对象逃脱死亡的最后机会,稍后GC会对F-Queue队列中的对象进行第二次标记。如果objA在finalize()方法中与引用链上的任何一个对象建立了联系,那么在第二次标记时,objA会被移出“即将回收”集合。之后,对象会再次出现没有引用存在的情况。在这个情况下,finalize方法不会被再次调用,对象会直接变成不可触及的状态,也就是说,一个对象的finalize()方法只会被调用一次

2、代码演示finalize()使用

/*** @author liuchao* @date 2023/3/4*/
public class Test6 {/*** 类变量,属于GC Roots的一部分*/public static Test6 testObj;@Overrideprotected void finalize() throws Throwable {super.finalize();System.out.println("调用当前类重写的finalize()方法");testObj = this;}public static void main(String[] args) throws InterruptedException {testObj = new Test6();// 主动删除引用testObj = null;System.gc();System.out.println("-----------------第一次gc操作------------");// 因为Finalizer线程的优先级比较低,暂停2秒,以等待它Thread.sleep(2000);if (testObj == null) {System.out.println("testObj is dead");} else {System.out.println("testObj is still alive");}System.out.println("-----------------第二次gc操作------------");// 主动删除引用testObj = null;System.gc();// 下面代码和上面代码是一样的,但是 testObj却自救失败了Thread.sleep(2000);if (testObj == null) {System.out.println("testObj is dead");} else {System.out.println("testObj is still alive");}}
}

http://www.yayakq.cn/news/627454/

相关文章:

  • 重庆专业网站建设在微信上怎么开店
  • 广西网站建设产品介绍wordpress社交游戏
  • 网站建设玖金手指花总seo企业网站源码
  • wordpress网站页面打开很慢如何重装电脑的wordpress
  • 张掖市住房和城乡建设厅网站云浮罗定哪有做网站的
  • 网站 建设 成品做片视频在线观看网站
  • 杭州建设培训中心网站免费制作婚介网站
  • 网站的二级导航怎么做沈阳网站推广公司排名
  • 门户网站建设预算表怎样做企业推广
  • 怎样销售网站金数字网站建设
  • html导航网站源码西安网站开发高端网站开发
  • 网站一般多少钱一年免费注册163免费邮箱
  • 静态学校网站做毕业设计网站建设维护费会计科目
  • 浙江省住建和城乡建设厅官方网站北京seo百科
  • 龙之向导的发展前景网站建设企业网站优化
  • 建设在线购物网站asp网站后台无法显示该页面
  • 天水 网站建设招聘在线crm客户管理系统
  • 自己做的网站数据库免费网站建设合同范本
  • 晋江网站开发什么样的网站适合搜索引擎收录
  • 免费网站建设程序下载郴州网站建设方案策划
  • 丰县数据网站建设多少钱中国城乡住建部建设部网站
  • 乐都网站建设淮安网站优化
  • 广州网站优化网站建设建筑网站 国外
  • 青之峰网站建设临淄信息港人才招聘
  • wordpress 企业网站 教程wordpress用户搜索次数
  • 印刷 技术支持 东莞网站建设网页设计html背景颜色
  • 上海手机响应式网站建设设计广州竞价托管公司
  • 什么是营销型的网站阿里巴巴运营每天必做
  • 手机网站的内容模块国外做珠宝裸石的网站
  • 怎样做instergram网站营销wordpress 时尚主题