关于finalize机制和引用、引用队列的一些总结

C++有析构函数这个东西,能够很好地在对象销毁前做一些释放外部资源的工作,但是java没有。Object.finalize()提供了与析构函数类似的机制,但是它不安全、会导致严重的内存消耗和性能降低,应该避免使用。best practice是:像java类库的IO流、数据库连接、socket一样,提供显示的资源释放接口,程序员使用完这些资源后,必须要显示释放。所以可以忘记Object.finalize()的存在。

关于引用和引用队列,java提供了4种引用类型,在垃圾回收的时候,都有自己各自的独特表现。ReferenceQueue是用来配合引用工作的,没有ReferenceQueue一样可以运行。创建引用的时候可以指定关联的队列,当GC释放对象内存的时候,会将引用加入到引用队列,这相当于是一种通知机制。当关联的引用队列中有数据的时候,意味着引用指向的堆内存中的对象被回收。

时间: 2024-11-06 20:43:20

关于finalize机制和引用、引用队列的一些总结的相关文章

finalize()和四种引用的一点思考

一次对ThreadLocal的学习引发的思考 ThreadLocal对Entry的引用是弱引用,于是联想到四种引用的生命周期. 强引用,不会进行垃圾回收 软引用,JVM内存不够,进行回收 弱引用,下次GC,直接进行回收 虚引用,不会对GC产生任何影响,结合ReferenceQueue使用,只为引用被回收时收到通知. 所以如果只有弱引用指向ThreadLocal,那么下次GC,ThreadLocal将被回收.阿里的代码规范上也要求ThreadLocal要被static修饰,就是为了防止后续还要使用

java中垃圾回收机制中的引用计数法和可达性分析法(最详细)

首先,我这是抄写过来的,写得真的很好很好,是我看过关于GC方面讲解最清楚明白的一篇.原文地址是:https://www.zhihu.com/question/21539353 原文地址:https://www.cnblogs.com/igoodful/p/8727241.html

文章汇总:关于java的finalize,引用和引用队列,自动释放系统外部资源的一些文章

之前写过一篇博客,关于非堆内存如何自动释放的,由此慢慢延伸写了几篇关于垃圾回收.finalize机制.引用和引用队列.sun.misc.Cleaner相关的文章,通过这几篇文章感觉自己收获很大了,对java垃圾回收相关的知识了解更深刻了.这篇博客主要做个汇总和简介,按照自己思路的延伸,把博客汇总下,方便大家阅读和查看. 1.学习NIO时候,对于DirectByteBuffer堆外内存的自动释放,因此了第一篇博客 java中使用堆外内存,关于内存回收需要注意的事和没有解决的遗留问题(等大神解答)

基于Java软引用机制最大使用JVM堆内存并杜绝OutOfMemory

题记:说好的坚持一周两篇文章在无数琐事和自己的懒惰下没有做好,在此表达一下对自己的不满并对有严格执行力的人深表敬意!!!! --------------------------------------------------------------------------------------------------------------------------------- 引文:Java程序员对OutOfMemory并不陌生,一般来说,出现此异常主要是由于应用里缓存了大量的数据没有被GC

第九讲.内存管理初级.(内存管理的方式,引用计数机制及影响计数的各个方法,dealloc方法,内存管理的基本原则,掌握copy的实现)

一.内存管理的方式. 1.进行内存管理的原因: 1>.由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等. 管理范围:任何继承NSObject的对象,对其他的基本数据类型无效. 2>.本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于栈中,而对象存储于堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指

4种Java引用浅解

近期研究Java Cache实现,发现使用到了软引用(SoftReference),不太理解,查阅了JDK文档.代码以及几篇文章.做个小结,如有错误,欢迎指正. 之所以想学习一下Java的几种引用类型,原因有两个: 理解Java Cache实现.学习Java引用与Java垃圾回收机制的关系 内存资源是有限的,须要合理的利用.Cache不是只HashMap那么简单,Java引用与Java垃圾回收机制也有很紧密的关系. 避免对Java引用的错误使用 某个同事把5000+交易数据放到一个HashMap

【J2SE】这才是java虚引用(PhantomReference)

一.java.lang.ref java.lang.ref包规范(参看JDK API中所述内容,本文就不贴出来了)有几个点很重要. 1. 这个包中的类使得应用程序可以与JVM垃圾收集器进行一些交互: 2. 引用的可达性逐渐降低:强引用.弱引用.软引用.虚引用: 3. 自动清除引用:只有弱引用和软引用会自动清除引用(这表明虚引用不会自动清除),清除的时机是将引用注册到引用队列之前(只有当内存不够用,软引用才会被回收:无论内存够不够用,只要发生垃圾回收,弱引用都会被回收): 4. 虚引用不会自动清除

浅解四种Java引用

最近研究Java Cache实现,发现使用到了软引用(SoftReference),不太理解,查阅了JDK文档.代码以及几篇文章.做个小结,如有错误,欢迎指正. 之所以想学习一下Java的几种引用类型,原因有两个: 理解Java Cache实现.学习Java引用与Java垃圾回收机制的关系 内存资源是有限的,需要合理的利用.Cache不是仅仅HashMap那么简单,Java引用与Java垃圾回收机制也有非常紧密的关系. 避免对Java引用的错误使用 某个同事把5000+交易数据放到一个HashM

Java的强引用、弱引用、软引用和虚引用

Java种除了基本数据类型,其它数据类型都是引用的数据类型.而应用数据类型根据生命周期的长短又分为:强引用.弱引用.软引用和需引用(幻象引用),我们平时基本上只用到强引用类型,而其他的引用类型我们也就在面试中,或者平日阅读类库或其他框架源码的时候才能见到. 1.强引用 用到的new了一个对象就是强引用,例如 Object obj = new Object(); 当JVM的内存空间不足时,宁愿抛出OutOfMemoryError使得程序异常终止也不会回收具有强引用的存活着的对象! 强引用对象回收: