面试:finalize

一、概述

将资源释放和清理放在finalize方法中非常不好,非常影响性能,严重时甚至会引起OOM(Out Of Memory),从Java9开始就被标注为@Deprecated,不建议被使用了。

二、两个重要的队列

1、unfinalized 队列

当重写了finalize方法的对象,在构造方法调用之时,JVM都会将其包装成一个Finalizer 对象,并加入unfinalized 队列中(静态成员变量、双向链表结构)

2、ReferenceQueue队列

第二个重要的队列,也是Finalizer类中一个静态成员变量,名为queue(是一个单向链表构),刚开始它是空的。当狗对象可以被当作垃圾回收时,就会把这些狗对象对应的Finalizer对象加入这个队列。

三、真正的回收时刻

  • 即使Dog对象没人引用,垃圾回收时也没法立刻回收它,因为Finalizer还在引用它嘛,为的是(先别着急回收啊,等我调完finalize方法,再回收
  • 查看FinalizerThread线程内的代码,这个线程从ReferenceQueue 中逐一取出每个 Finalizer对象,把它们从链表断开,这样没谁能引用到它,以及其对应的狗对象,所以下次gc时就可以被回收了

 

四、为什么finalize方法非常不好,非常影响性能

1、非常不好

  • FinalizerThread是守护线程,代码很有可能没来得及执行完,线程就结束了,造成资源没有正确释放
  • 异常被吞掉这个就太糟了,你甚至不能判断有没有在释放资源时发生错误

2、影响性能

  • 重写了finalize 方法的对象在第一次被gc时,并不能及时释放它占用的内存,因为要等着FinalizerThread调用完finalize,把它从第一-个unfinalized队列移除后,第二次gc时才能真正释放内存.
  • 可以想象gc本就因为内存不足引起,finalize 调用又很慢( 两个队列的移除操作,都是串行执行的,用来释放连接类的资源也应该不快),不能及时释放内存,对象释放不及时就会逐渐移入老年代,老年代垃圾积累过多就会容易full gc, full gc后释放速度如果仍跟不上创建新对象的速度,就会OOM.

3、质疑

  • 有的文章提到【Finalizer线程会和我们的主线程进行竞争,不过由于它的优先级较低,获取到的CPU时间较少,因此它永远也赶不上主线程的步伐】这个显然是错误的,FinalizerThread的优先级较普通线程更高,赶不上步伐的原因应该是finalize 执行慢等原因综合导致
     

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/3987.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面向对象开发技术(第三周)

回顾 上一堂课主要学习了面向对象编程与非面向对象编程(面向功能、过程编程),本节课就重点来看看面向对象编程中的一个具体思想——抽象 面向对象编程的特性:1、封装性 2、继承性 3、多态性 封装:意味着提供服务接口…

基于自注意力机制的长短期记忆神经网络(LSTM-SelfAttention)的回归预测

提示:MATLAB版本需要R2023a以上 基于自注意力机制的长短期记忆神经网络(LSTM-SelfAttention)是一种用于时序数据预测的模型。这个模型结合了两个不同的结构,即长短期记忆网络(LSTM)和自注意力机制&#xff…

备考2024年小学生古诗文大会:做做10道历年真题和知识点(持续)

根据往年的安排,2024年上海市小学生古诗文大会预计还有一个月就将启动。我们继续来随机看10道往年的上海小学生古诗文大会真题,这些题目来自我去重、合并后的1700在线题库,每道题我都提供了参考答案和独家解析。 根据往期的经验,只…

docker使用,安装go和centos7

一、安装docker 二、使用docker 1、下载镜像centos docker pull centos:7.2.1511 2、查看容器 docker ps -a 3、创建容器,创建后 状态:CREATE docker create -it centos:7.2.1511 /bin/bash 4、启动容器 (先查看容器id启动 CONTAINER…

【C++】类和对象⑤(static成员 | 友元 | 内部类 | 匿名对象)

🔥个人主页:Forcible Bug Maker 🔥专栏:C 目录 前言 static静态成员 友元 友元函数 友元类 内部类 匿名对象 结语 前言 本篇主要内容:类和对象的一些知识点补充,包括static静态成员,友…

HashSet的源码剖析和static,final的作用

一、HashSet源码简析 HashSet 是 Java 集合框架中的一个重要类,它实现了 Set 接口,用于存储不重复的元素。HashSet 内部实际上是通过 HashMap 来实现的,其中每个元素都是 HashMap 的一个键,而值则是一个固定的对象(通…

STM32的Flash读写保护

参考链接 STM32的Flash读写保护,SWD引脚锁的各种解决办法汇总(2020-03-10)-腾讯云开发者社区-腾讯云 (tencent.com)https://cloud.tencent.com/developer/article/1597959 STM32系列芯片Flash解除写保护的办法 - 知乎 (zhihu.com)https://zh…

调度问题变形的贪心算法分析与实现

调度问题变形的贪心算法分析与实现 一、问题背景与算法描述二、算法正确性证明三、算法实现与分析四、结论 一、问题背景与算法描述 带截止时间和惩罚的单位时间任务调度问题是一个典型的贪心算法应用场景。该问题的目标是最小化超过截止时间导致的惩罚总和。给定一组单位时间…

通过idea插件一键将jar包发布到阿里云服务器部署

通过idea插件一键将jar包发布到阿里云服务器部署_idea发包工具-CSDN博客

【AIGC调研系列】大型语言模型如何减少幻觉生成

在解读大型语言模型(LLMs)中的长格式事实性问题时,我们首先需要认识到这些模型在生成内容时可能会产生与既定事实不一致的情况,这种情况通常被称为“幻觉”[2][3]。这种现象不仅可能导致信息的误传,还可能对社会造成误…

责任链模式的应用

设计模式责任链模式 责任链模式介绍 概述 责任链模式是一种行为型模式。责任链模式里,很多对象由每一个对象对其下家的引用而连接起来形成一条链。请求在这个链上传递,直到链上的某一个对象决定处理此请求。发出这个请求的客户端并不知道链上的哪一个对象最终处理这个请求…

使用nssm把批处理(.bat)文件设置为Windows 服务

本文以canal为例 使用nssm把批处理(.bat)文件设置为Windows 服务 下载 nssm: 前往 nssm 官方网站 下载适用于系统的 nssm 工具。 安装 nssm: 将下载的 nssm 压缩文件解压缩到一个合适的位置,如 D:\nlc\6.Canal-1.1.5\nssm-2.24\win64\nss…

【每日一题】补档 CF1065 C. Make It Equal | 思维 | 中等

题目内容 原题链接 给定一个长度为 n n n 的数组 a a a ,每次操作可以选择一个数 x x x ,将所有大于 x x x 的数都下降为 x x x ,一次操作的下降总代价为 s s s ,要求 s ≤ k s\leq k s≤k ,问需要多少次操作使…

深度学习运算:CUDA 编程简介

一、说明 如今,当我们谈论深度学习时,通常会将其实现与利用 GPU 来提高性能联系起来。GPU(图形处理单元)最初设计用于加速图像、2D 和 3D 图形的渲染。然而,由于它们能够执行许多并行操作,因此它们的实用性…

kafka启动报错(kafka.common.InconsistentClusterIdException)

文章目录 前言kafka启动报错(kafka.common.InconsistentClusterIdException)1. 查找日志2. 定位问题/解决 前言 如果您觉得有用的话,记得给博主点个赞,评论,收藏一键三连啊,写作不易啊^ _ ^。   而且听说点赞的人每天的运气都不…

SpringCloud系列(17)--将服务消费者Consumer注册进Zookeeper

前言:在上一章节中我们把服务提供者Provider注册进了Zookeeper,而本章节则是关于如何将服务消费者Consumer注册进Zookeeper 1、再次创建一个服务提供者模块,命名为consumerzk-order80 (1)在父工程下新建模块 (2)选择模块的项目类型为Maven并…

稳态视觉诱发电位 (SSVEP) 分类学习系列 (4) :Temporal-Spatial Transformer

稳态视觉诱发电位分类学习系列:Temporal-Spatial Transformer 0. 引言1. 主要贡献2. 提出的方法2.1 解码的主要步骤2.2 网络的主要结构 3. 结果和讨论3.1 在两个数据集下的分类效果3.2 与基线模型的比较3.3 消融实验3.4 t-SNE 可视化 4. 总结欢迎来稿 论文地址:http…

【后端学习笔记·Golang】手机短信验证

文章目录 手机号码验证前置准备开通阿里云sms服务获取AccessKey并下载sdk 生成随机验证码将验证码发送到用户手机接口发送验证码校验验证码 手机号码验证 流程: 接收用户请求后生成随机验证码,并将验证码存入Redis中,并设置TTL通过阿里云sd…

Qt : 实现串口的同步和异步读写消息

一、同步/异步 在串口通信中,同步和异步读写消息是两种常见的通信模式。下面简要介绍它们的区别和示例: 同步读写消息 同步读写:在同步通信中,发送方发送数据后会等待接收方的响应,直到接收到响应后才继续执行后续操…

【C++】C++ 锁(std::mutex)的使用及其使用

在C中,锁是一种同步机制,用于保护共享资源在多线程环境下的访问安全,防止因并发访问导致的数据不一致、竞态条件等问题。 以下是对C中锁相关概念、类型以及使用方法的详细介绍: 1. 互斥锁(Mutex) 互斥锁…