java中的finalize()方法

stm32f103c8t6的中文字库 stm32的成熟中文字库,上手即用,操作简单 阅读详情

      当垃圾收集器认为没有指向对象实例的引用时,会在销毁该对象之前调用finalize()方法。该方法最常见的作用是确保释放实例占用的全部资源。java并不保证定时为对象实例调用该方法,甚至不保证方法会被调用,所以该方法不应该用于正常内存处理。

 

下文链接:http://www.softhouse.com.cn/news/show/194.html

    在许多方面, Java 类似于 C++ 。 Java 的语法非常类似于 C++ , Java 有类、方法和数据成员; Java 的类有构造函数; Java 有异常处理。

 

    但是,如果你使用过 C++ 会发现 Java 也丢掉一些可能是你熟悉的特性。这些特性之一就是析构函数。取代使用析构函数, Java 支持 finalize() 方法。

 

    在本文中,我们将描述 finalize() 与 C++ 析构函数的区别。另外,我们将创建一个简单的 Applet 来演示 finalize() 是如何工作的。

 

最终的界限

 

    与 Java 不同, C++ 支持局部对象(基于栈)和全局对象(基于堆)。因为这一双重支持, C++ 也提供了自动构造和析构,这导致了对构造函数和析构函数的调用,(对于堆对象)就是内存的分配和释放。

 

    在 Java 中,所有对象都驻留在堆内存,因此局部对象就不存在。结果, Java 的设计者觉得不需要析构函数(象 C++ 中所实现的)。

 

    取而代之, Java 定义了一个特殊的方法叫做 finalize() ,它提供了 C++ 析构函数的一些功能。但是, finalize() 并不完全与 C++ 的析构函数一样,并可以假设它会导致一系列的问题。 finalize() 方法作用的一个关键元素是 Java 的垃圾回收器。

 

垃圾回收器

 

    在 C/C++ 、 Pascal 和其他几种多种用途的编程语言中,开发者有责任在内存管理上发挥积极的作用。例如,如果你为一个对象或数据结构分配了内存,那么当你不再使用它时必须释放掉该内存。

 

    在 Java 中,当你创建一个对象时, Java 虚拟机( JVM )为该对象分配内存、调用构造函数并开始跟踪你使用的对象。当你停止使用一个对象(就是说,当没有对该对象有效的引用时), JVM 通过垃圾回收器将该对象标记为释放状态。

 

    当垃圾回收器将要释放一个对象的内存时,它调用该对象的 finalize() 方法(如果该对象定义了此方法)。垃圾回收器以独立的低优先级的方式运行,只有当其他线程挂起等待该内存释放的情况出现时,它才开始运行释放对象的内存。(事实上,你可以调用 System.gc() 方法强制垃圾回收器来释放这些对象的内存。)

 

    在以上的描述中,有一些重要的事情需要注意。首先,只有当垃圾回收器释放该对象的内存时,才会执行 finalize() 。如果在 Applet 或应用程序退出之前垃圾回收器没有释放内存,垃圾回收器将不会调用 finalize() 。

 

    其次,除非垃圾回收器认为你的 Applet 或应用程序需要额外的内存,否则它不会试图释放不再使用的对象的内存。换句话说,这是完全可能的:一个 Applet 给少量的对象分配内存,没有造成严重的内存需求,于是垃圾回收器没有释放这些对象的内存就退出了。

 

    显然,如果你为某个对象定义了 finalize() 方法, JVM 可能不会调用它,因为垃圾回收器不曾释放过那些对象的内存。调用 System.gc() 也不会起作用,因为它仅仅是给 JVM 一个建议而不是命令。

 

finalize() 有什么优点呢?

 

    如果 finalize() 不是析构函数, JVM 不一定会调用它,你可能会疑惑它是否在任何情况下都有好处。事实上,在 Java 1.0 中它并没有太多的优点。

 

    根据 Java 文档, finalize() 是一个用于释放非 Java 资源的方法。但是, JVM 有很大的可能不调用对象的 finalize() 方法,因此很难证明使用该方法释放资源是有效的。

 

      Java 1.1 通过提供一个 System.runFinalizersOnExit() 方法部分地解决了这个问题。(不要将这个方法与 Java 1.0 中的 System.runFinalizations() 方法相混淆。)不象 System.gc() 方法那样, System.runFinalizersOnExit() 方法并不立即试图启动垃圾回收器。而是当应用程序或 Applet 退出时,它调用每个对象的 finalize() 方法。

 

    正如你可能猜测的那样,通过调用 System.runFinalizersOnExit() 方法强制垃圾回收器清除所有独立对象的内存,当清除代码执行时可能会引起明显的延迟。现在建立一个示例 Applet 来演示 Java 垃圾回收器和 finalize() 方法是如何相互作用的。

YOLO-World:从入门到实战的多模态目标检测全指南 想象一下,你给模型一张“公园”的图片,再输入文字“红色的郁金香”,它能直接在图中框出所有红色郁金香的位置——这就是多模态目标检测:结合图像视觉信息和文本语义信息,同时完成“是什么”(分类)和“在哪里”(定位)的任务。传统目标检测(如YOLOv5、YOLOv8)只能识别预定义的类别(比如训练时学过“猫”“狗”),但多模态目标检测摆脱了“类别预定义”的限制,只要文本能描述,它就能检测,这就是“开放词汇检测(Open-Vocabulary Detection)”的魅力。 阅读详情

相关推荐

别再只用三次多项式了!用MATLAB手把手教你搞定七次多项式轨迹规划(附完整代码)

本文详细介绍了七次多项式在轨迹规划中的优势与应用,通过MATLAB实现从理论推导到实际代码的全过程。相比传统的三次多项式,七次多项式能精确控制位置、速度、加速度和加加速度,实现更平滑的运动控制,特别适用于工业机器人和数控机床等高精度场景。文章包含完整的MATLAB代码示例和优化技巧,帮助工程师快速掌握这一高级轨迹规划方法。

weixin_30872337的博客 298

Java中的finalize()方法

原文:https://blog.youkuaiyun.com/Justin_zhao/article/details/74358828 ...

sangyi1122的博客 388

Rocky Linux 9 离线环境Docker部署实战:从依赖打包到服务启动

本文提供了一份详尽的Rocky Linux 9离线环境Docker部署实战指南。针对无法访问外网的生产或内网服务器,文章详细讲解了如何在联网跳板机上下载Docker二进制包及所有系统依赖RPM包,并完成打包。随后,手把手指导在离线服务器上进行依赖安装、二进制文件部署、systemd服务配置、SELinux与防火墙调优,最终实现Docker服务的成功启动与验证。

weixin_28363123的博客 138

Java中的finalize详解

程序员都了解初始化的重要性,但常常会忘记同样重要的清除工作。毕竟,谁需要清除一个int 呢?但在使用程序库时,把一个对象用完后就“弃之不顾”的做法并非总是安全的。当然,Java有垃圾回收器来回收无用对象占据的内存资源。但也有特殊情况:假定你的对象(并非使用 new)获得了一块“特殊”的内存区域,由于垃圾回收器只知道释放那些经由 new分配的内存,所以它不知道该如何释放该对象的这块 “特殊”内存。为

ajian005的专栏 935

用Python模拟随机游走:从一维到三维,直观理解马尔可夫链的常返性

本文通过Python模拟一维到三维的随机游走,直观展示马尔可夫链的常返性特性。使用NumPy和Matplotlib构建模拟器,揭示不同维度下随机游走的返回概率差异,帮助读者理解为什么一维和二维游走具有常返性,而三维游走可能永远迷失。文章包含完整的代码示例和可视化技巧,适合概率论和Python编程爱好者学习实践。

weixin_28694295的博客 400

ubuntu linux虚拟机安装部署openclaw详细教程(安装、问题处理)

本文详细介绍了在Ubuntu系统下安装OpenClaw AI助手的完整流程及常见问题解决方案。主要内容包括:1) 通过GIT、Node.js等基础环境配置;2) 使用官方脚本或源码编译两种方式安装OpenClaw;3) 配置向导中的关键选项说明;4) 针对systemctl服务启动失败等常见错误的处理方法。文章特别强调了权限管理、网络依赖和访问配置等易错环节,提供了修改service文件等具体解决方案,帮助开发者顺利完成部署并实现Web UI访问。教程实操性强,适合本地和云服务器环境部署参考。

少说,多做 2032

java的finalize方法

我们通常用构造器来创建对象,而Finalize正好相反,构造方法执行对象的初始化操作,finalize方法执行对象的销毁操作. 那我们什么时候需要使用finalize方法呢,我们都知道Java里垃圾回收器可以回收对象使用的内存空间,但是对象可能会 持有很多资源比如Socket、文件句柄等,垃圾收集器无法回收这些资源,因此你需要使用finalize方法帮助GC回收这些 资源,比如关闭打开的文件或者网元资源,删除临时文件等. 一个例子 Object类是所有类的父类,如果你去查看java.lang.Object类

weixin_43831204的博客 1万+

【Docker安装】Ubuntu 24.04.2 LTS系统下安装Docker环境——指定APT源安装方式

【Docker安装】Ubuntu 24.04.2 LTS系统下安装Docker环境——指定APT源安装方式

jks212454的博客 625

Java中的finalize方法

当一个对象没有引用的时候,对象的垃圾回收器会调用finalize方法。当对象被回收时,系统自动调用该对象的finalize方法,子类可以重写该方法,做一些释放资源的操作。什么时候被回收:当某个对象没有任何引用时,jvm就认为这个对象是一个垃圾对象,就会使用垃圾回收机制来销毁该对象,在销毁对象前,会先调用finalize方法。垃圾回收机制的调用,是由系统来决定(有自己的GC算法),也可以通过System.gc()主动触发垃圾回收机制。

SakuraMG的博客 4035

2024年11月架构设计师案例分析真题回顾,附参考答案、解析及所涉知识点(二)

软考高级系统架构设计师考试包含三个科目:信息系统综合知识、案例分析和系统架构设计论文。考试形式为机考。本文主要回顾2024年下半年(2024-11-10)系统架构设计师考试上午第二科案例分析的题目,同时附带参考解答、解析和所涉知识点。

一几文的编程学习笔记。 1661

在WSL2中配置代理(Windows)

通过按照上述步骤在WSL2中配置代理,我们可以轻松地在Windows子系统Linux中使用代理服务器访问互联网。请确保提供正确的代理服务器地址和端口号,并根据实际情况进行修改。在WSL2中使用代理是一个常见的需求,它允许我们在Windows子系统Linux中通过代理服务器访问互联网。本文将详细介绍如何在WSL2中配置代理,并提供相应的源代码示例。如果返回的IP地址与代理服务器所在地不同,说明代理正常工作。希望本文能对你有所帮助!如有其他问题,请随时向我提问。替换为实际的代理服务器地址和端口号。

FcUnity的博客 4356

finalize()方法

finalize()方法

qq_55105067的博客 2215

CH7034B显示模块原理图设计,已量产

显示桥接板的价值,不在于简单把 RGB 排线换成另一种接口,而在于能否把并行视频、时钟、显示控制、模拟输出和辅助配置同时组织成稳定系统。当前这张 CH7034B 原理图就是这种思路:U3 CH7034B 作为核心桥接芯片,输入侧是 LCD_R0~R7、LCD_G0~G7、LCD_B0~B7、LCD_DE、LCD_HSYNC、LCD_VSYNC、LCD_CLK 与 LCD_BL,输出侧则通过 DAC0~DAC2 和 DDC_SC/DDC_SD 形成模拟显示接口边界。

不脱发的程序猿 162

Java中finalize()方法的使用

Java编程思想 finalize()方法是Object类中提供的一个方法,在GC准备释放对象所占用的内存空间之前,它将首先调用finalize()方法。其在Object中定义如下: protected void finalize() throws Throwable { } 1 finalize()调用的时机 与C++的析构函数(对象在清除之前析构函数会被调用)不同,在Java中,由于GC...

Lumia 4万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

java中finalize()方法

finalize 垃圾回收机器(Garbage Collection),也叫GC,垃圾回收器主要有一下特点: 当对象不再被程序所使用的时候,垃圾回收器将会将其回收 垃圾回收是在后台运行的,我们无法命令垃圾回收器马上回收资源,但是我们可以告诉他可以尽快回收资源(System.gc()和Runtime.getRuntime().gc()) 垃圾回收器在回收某个对象的时候,首先会调用该对象的finalize()方法 GC主要针对堆内存 单例模式的缺点 finalize()是Object里面的一个方法,当一个堆

南宫沉梦博客 3万+

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Java为什么弃用 finalize() 方法?

引言 接上篇文章Object源码分析,我们知道了Java 从 1.0 开始就有了 finalize() 方法,不过这个方法一直被认为是一个糟糕的设计,也是 Java 平台的一个遗留的大“毒瘤”。 垃圾回收器会特别对待覆盖了 finalize() 方法的对象。一般情况下,在垃圾回收期间,一个无法触及的对象会立即被销毁。不过,覆盖了 finalize() 方法的对象会被移动到一个队列里,一个独立的线程...

朝夕 6048

关于java中的finalize()方法

关于finalize()方法,之前了解的并不是很多,看《java编程思想》时才对此有所了解,之后我又看了些博客,稍微总结了一下finalize()方法: java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize()。 (1).对象不一定会被回收。 (2).垃圾回收不是析构函数。 (3).垃圾回收只与内存有关。 (4).垃圾回收和finalize()都是靠不住的,...

Lemon_MY的博客 3003

Java finalize() 方法

Java finalize()方法执行机制由Finalizer类、GC和FinalizerThread协同完成。执行流程包括可达性分析、资格校验、异步执行和二次可达性分析,但存在执行非必然性、时机不确定等核心约束,因此不推荐作为资源释放手段。

2401_84284464的博客 696

Java中Object的finalize()方法

finalize()是什么? finalize()方法是Java中Object类的一个空实现方法,我们都知道,Java中所有的类都是继承自Object,那么就是说,所有的类都有这个方法。我们先来看看该方法 /** * Called by the garbage collector on an object when garbage collection * dete

Thuantanon的博客 9817

java的finalize_Java中finalize()方法

finalize()方法是Object类中提供的一个方法,在GC准备释放对象所占用的内存空间之前,它将首先调用finalize()方法。其在Object中定义如下:protected void finalize() throws Throwable { }1 finalize()调用的时机与C++的析构函数(对象在清除之前析构函数会被调用)不同,在Java中,由于GC的自动回收机制,因而并不能保证...

weixin_39960145的博客 599

Java中Object类之finalize()方法的详解

程序员都知道“初始化”的重要性,但通常都会忘记清除的重要性。当然Java可用垃圾收集器回收不再使用的对象所占据的内存。但对于一个“特殊”的内存区域--没有使用new关键字来分配,垃圾收集器只知道释放那些由new分配的内存(垃圾收集器简介),那该如何回收这“特殊”的内存呢? Java提供了一个被称为收尾的机制。使用这个机制,你可以定义一些特殊的操作,这些操作将在一个...

学习记录 3614

java finalize逃脱_关于Java中的finalize()方法

java提供finalize()方法,垃圾回收器准备释放内存的时候,会先调用finalize()。(1).对象不一定会被回收。(2).垃圾回收不是析构函数。(3).垃圾回收只与内存有关。(4).垃圾回收和finalize()都是靠不住的,只要JVM还没有快到耗尽内存的地步,它是不会浪费时间进行垃圾回收的。垃圾收集器在进行垃圾收集的时候会自动呼叫对象的finalize方法,用来进行一些用户自定义的非...

weixin_29473667的博客 177

java - finalize() 方法

finalize() 方法finalize 方法定义在 Object 类中,其方法签名如下:protected void finalizer() throw Throwable { } finalize 方法在 GC(垃圾回收器)决定回收一个不被其他对象引用的对象时调用。子类覆写 finalize 方法来处置系统资源或是负责清除操作。 finalizer 方法的调用时机由 sun 和 JVM 开发商

Duan的博客 723

java enum方法_Java Enum finalize()方法与示例

java enum方法 枚举类finalize()方法 (Enum Class finalize() method) finalize() method is available in java.lang package. finalize()方法在java.lang包中可用。 finalize() method is used to represent that enum classes do ...

cumubi7552的博客 215

java调用finalize()方法

为什么80%的码农都做不了架构师?>>> ...

weixin_33966095的博客 673
上一篇: java中的equals()方法
下一篇: java中的finalize()方法
junherry
博客等级 码龄20年 39粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值