finalize关键字和垃圾回收的一些知识

2024-08-22 08:38

本文主要是介绍finalize关键字和垃圾回收的一些知识,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.finalize()方法

1)finalize()的工作原理:假定一旦垃圾回收器准备好释放对象占用的存储空间,将首先调用其finalize()方法,并且在下一次垃圾回收时候做一些重要的清理工作。

2)JAVA中的对象并非总是被垃圾回收:

a)垃圾可能不被垃圾回收

b)垃圾回收并不等于“析构”

c)垃圾回收只与内存有关

使用垃圾回收的唯一原因是为了回收程序不再使用的内存,所以对于与垃圾回收有关的任何行为来说,它们也必须同内存及其回收有关。

2.如何进行的垃圾回收

1)引用计数法:是一种简单但是速度很慢的垃圾回收技术。每个对象都含有一个引用计数器,当有引用连接到对象时,引用计数加1.当引用离开作用域或被置为null时,引用计数减1.虽然管理引用计数的开销不大,但是这开销需要在整个程序的生命周期中将持续发生,垃圾回收器会在含有全部对象的列表上遍历,当发现某个对象的引用计数为0时,就释放其占用的空间。这个方法也有缺陷,如果对象之间存在循环引用,可能会出现“对象应该被回收,但是引用计数却不是0”的情况。对于垃圾回收器而言,定位这样的交互自引用的对象组所需的工作量极大。引用计数常用来说明垃圾收集的工作方式,但似乎未被应用到任何一种java虚拟机实现中。

2)根搜索算法

通过假定的一个root开始搜索,沿着每条引用搜索,如果该对象到root不可达,此时该对象就会被垃圾回收。

3.一些更快的模式中,垃圾回收并非基于引用计数技术。他们依据的思想是:对任何“活”的对象,一定能最终追溯到其存活在堆栈或静态存储区之中的引用。这个引用链条可能会穿过数个对象层次。由此,如果从堆栈或者静态存储区开始,遍历所有的引用,就能找到所有“活”的对象。对于发现的每个引用,必须追踪他所引用的对象,然后是此对象包含的所有引用,访问过的对象必须都是“活”的。这就解决了“交互自引用的对象组”的问题(这种现象根本不会被发现,因此也就被自动回收了)。

4.Java虚拟机中有许多附加的技术用来提升速度。尤其是与加载器操作有关,被称作为"即时"编译器的技术。这种技术可以吧程序全部或部分翻译成本地机器码,程序的运行速度因此得到了提升。当需要装在某个类时,编译器会先找到其.class文件,然后将该类的字节码装入内存,此时有两种方案可以供选择。一种是让即时编译器编译所有的代码,这种做法有两个缺陷:这种动作散落在整个程序的生命周期内,累加起来花更多的时间;并且会增加可执行代码的长度,这将导致页面调度,从而降低程序速度。另外一种做法是惰性评估,即时编译器只在必要的时候才去编译代码。这样,从不会被执行的代码也许就压根不会被JIT所编译。

这篇关于finalize关键字和垃圾回收的一些知识的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1095777

相关文章

Java中的抽象类与abstract 关键字使用详解

《Java中的抽象类与abstract关键字使用详解》:本文主要介绍Java中的抽象类与abstract关键字使用详解,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、抽象类的概念二、使用 abstract2.1 修饰类 => 抽象类2.2 修饰方法 => 抽象方法,没有

Unity新手入门学习殿堂级知识详细讲解(图文)

《Unity新手入门学习殿堂级知识详细讲解(图文)》Unity是一款跨平台游戏引擎,支持2D/3D及VR/AR开发,核心功能模块包括图形、音频、物理等,通过可视化编辑器与脚本扩展实现开发,项目结构含A... 目录入门概述什么是 UnityUnity引擎基础认知编辑器核心操作Unity 编辑器项目模式分类工程

Python批量替换多个Word文档的多个关键字的方法

《Python批量替换多个Word文档的多个关键字的方法》有时,我们手头上有多个Excel或者Word文件,但是领导突然要求对某几个术语进行批量的修改,你是不是有要崩溃的感觉,所以本文给大家介绍了Py... 目录工具准备先梳理一下思路神奇代码来啦!代码详解激动人心的测试结语嘿,各位小伙伴们,大家好!有没有想

Java中的volatile关键字多方面解析

《Java中的volatile关键字多方面解析》volatile用于保证多线程变量可见性与禁止重排序,适用于状态标志、单例模式等场景,但不保证原子性,相较synchronized更轻量,但需谨慎使用以... 目录1. volatile的作用1.1 保证可见性1.2 禁止指令重排序2. volatile的使用

C#中lock关键字的使用小结

《C#中lock关键字的使用小结》在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时,其他线程无法访问同一实例的该代码块,下面就来介绍一下lock关键字的使用... 目录使用方式工作原理注意事项示例代码为什么不能lock值类型在C#中,lock关键字用于确保当一个线程位于给定实例的代码块中时

Linux线程之线程的创建、属性、回收、退出、取消方式

《Linux线程之线程的创建、属性、回收、退出、取消方式》文章总结了线程管理核心知识:线程号唯一、创建方式、属性设置(如分离状态与栈大小)、回收机制(join/detach)、退出方法(返回/pthr... 目录1. 线程号2. 线程的创建3. 线程属性4. 线程的回收5. 线程的退出6. 线程的取消7.

使用Python实现Windows系统垃圾清理

《使用Python实现Windows系统垃圾清理》Windows自带的磁盘清理工具功能有限,无法深度清理各类垃圾文件,所以本文为大家介绍了如何使用Python+PyQt5开发一个Windows系统垃圾... 目录一、开发背景与工具概述1.1 为什么需要专业清理工具1.2 工具设计理念二、工具核心功能解析2.

Java 关键字transient与注解@Transient的区别用途解析

《Java关键字transient与注解@Transient的区别用途解析》在Java中,transient是一个关键字,用于声明一个字段不会被序列化,这篇文章给大家介绍了Java关键字transi... 在Java中,transient 是一个关键字,用于声明一个字段不会被序列化。当一个对象被序列化时,被

JVM垃圾回收机制之GC解读

《JVM垃圾回收机制之GC解读》:本文主要介绍JVM垃圾回收机制之GC,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、死亡对象的判断算法1.1 引用计数算法1.2 可达性分析算法二、垃圾回收算法2.1 标记-清除算法2.2 复制算法2.3 标记-整理算法2.4

一文详解Java异常处理你都了解哪些知识

《一文详解Java异常处理你都了解哪些知识》:本文主要介绍Java异常处理的相关资料,包括异常的分类、捕获和处理异常的语法、常见的异常类型以及自定义异常的实现,文中通过代码介绍的非常详细,需要的朋... 目录前言一、什么是异常二、异常的分类2.1 受检异常2.2 非受检异常三、异常处理的语法3.1 try-