众所周知,Java语言提供了自动垃圾回收机制,使得程序员不用考虑自己释放不再使用的内存。既然回收内存的活都让Java自己干了,程序员在这方面能干的事情就不多了。尽管如此,Java也提供了一些让程序员对自动内存回收施加影响的方式。finalize()和PhantomReference就是其中两种,它们都能在自动内存回收的特定时刻运行程序员提供的代码,通常这些代码用来回收一些自动回收机制无法回收的资源。

1. Object.finalize()

finalize()出现的较早,由于有以下的缺点,已经在Java 9中被弃用。

The finalization mechanism is inherently problematic. Finalization can lead to performance issues, deadlocks, and hangs. Errors in finalizers can lead to resource leaks; there is no way to cancel finalization if it is no longer necessary; and no ordering is specified among calls to finalize methods of different objects. Furthermore, there are no guarantees regarding the timing of finalization. The finalize method might be called on a finalizable object only after an indefinite delay, if at all.

2. PhantomReference

PhantomReference能够让程序员提供一个ReferenceQueue,当相关的对象被自动垃圾回收线程finalized时,对应的PhantomReference对象就会被放入ReferenceQueue,以此来通知程序员做一些资源清理工作。

3. 推荐的方法

如果使用这两种方式来释放系统资源,它们都无法知道程序员提供的清理动作会在何时被执行。因此,推荐的做法是:

Classes whose instances hold non-heap resources should provide a method to enable explicit release of those resources, and they should also implement AutoCloseable if appropriate.

参考资料

1. https://docs.oracle.com/javase/9/docs/api/java/lang/Object.html#finalize--

2. Java PhantomReferences: A better choice than finalize()

转载于:https://www.cnblogs.com/seagoo/p/10372569.html

finalize()与PhantomReference学习笔记相关推荐

  1. 学习笔记【Java 虚拟机②】垃圾回收

    若文章内容或图片失效,请留言反馈.部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 总目录 学习笔记[Java 虚拟机①]内存结构 学习笔记[Java 虚拟机②]垃圾回收 学习笔记[Java ...

  2. 学习笔记:Java虚拟机——JVM内存结构、垃圾回收、类加载与字节码技术

    学习视频来源:https://www.bilibili.com/video/BV1yE411Z7AP Java类加载机制与ClassLoader详解推荐文章:https://yichun.blog.c ...

  3. JVM学习笔记之四 四种引用和垃圾回收的两次标记

    四种引用和两次标记 四种引用 java中的数据类型我们知道是分为基本数据类型和引用类型的.基本数据类型是8种,分别是boolean byte short int long double float c ...

  4. Java虚拟机(JVM)与Java内存模型(JMM)学习笔记

    Java虚拟机[JVM]与Java内存模型[JMM]学习笔记 Java虚拟机(JVM) 三种JVM JVM 位置 JVM的主要组成部分及其作用 类加载器 双亲委派机制 沙箱安全机制 Java本地接口( ...

  5. Java虚拟机(JVM)学习笔记(不定时更新)

    Java虚拟机(JVM)学习笔记 不少组织都曾开发过Java虚拟机: SUN公司曾经使用过3个虚拟机,Classic.Exact VM.Hotspot.     其中Hotspot虚拟机沿用至今,并已 ...

  6. Web Service学习笔记

    Web Service概述 Web Service的定义 W3C组织对其的定义例如以下,它是一个软件系统,为了支持跨网络的机器间相互操作交互而设计.Web Service服务通常被定义为一组模块化的A ...

  7. java学习笔记6--类的继承、Object类

    接着前面的学习: java学习笔记5--类的方法 java学习笔记4--类与对象的基本概念(2) java学习笔记3--类与对象的基本概念(1) java学习笔记2--数据类型.数组 java学习笔记 ...

  8. Java开发面试高频考点学习笔记(每日更新)

    Java开发面试高频考点学习笔记(每日更新) 1.深拷贝和浅拷贝 2.接口和抽象类的区别 3.java的内存是怎么分配的 4.java中的泛型是什么?类型擦除是什么? 5.Java中的反射是什么 6. ...

  9. java学习笔记16--异常

    java学习笔记16--异常 异常 异常时导致程序中断运行的一种指令流,如果不对异常进行正确的处理,则可能导致程序的中断执行,造成不必要的损失, 所以在程序的设计中必须要考虑各种异常的发生,并正确的做 ...

  10. 菜鸟学习笔记:Java基础篇3(面向对象思想、程序执行过程内存分析、面向对象重要概念)

    菜鸟学习笔记:Java面向对象篇上 Java面向对象的思想 Java程序执行过程内存分析 Java垃圾回收机制 构造方法 方法重载(overload) static关键字 this关键字 Java面向 ...

最新文章

  1. Linux学习-文件管理(2)
  2. 能干掉苹果的中国黑客
  3. Thrift之Protocol源码分析
  4. 《研磨设计模式》chap22 装饰模式Decorator(2)应用到场景
  5. 神策数据王灼洲 徐缓:ID-Mapping 用户打通那些事儿
  6. DDoS攻防战 (二) :CC攻击工具实现与防御理论
  7. 飞秋局域网聊天是一种技术工作
  8. ECCV2018 Oral论文集
  9. .NET设计模式(2): 工厂方法模式
  10. SQL 已有数据的表创建标识列
  11. Springboot 后台管理框架halo.kotlin
  12. 初识Opserver,StackExchange的监控解决方案
  13. 孤儿进程与僵尸进程产生及其处理
  14. 使用stata临床决策曲线进行外部模型验证
  15. Firefox默认英文修改中文
  16. 用友通新建账套显示不能登入到服务器,用友通打不开,出现登录失败
  17. springboot 发送腾讯企业邮箱
  18. 基于vue的仿饿了么webapp
  19. 如何访问网络上其他计算机,电脑怎么连接别的网络
  20. 理解对方暴露服务的对象 Ingress 和 Service

热门文章

  1. Atitit mq读取队列信息 范例 目录 1.1. 读取原理与主要流程 1 1.2. 范例项目 C:\0wkspc\MqDemoPrj 1 1.3. 范例代码 1 1.1.读取原理与主要流程
  2. Atitit 搜集热点,热门文章的整理 attilax 最近
  3. Atitit. 解释器模式框架选型 and应用场景attilax总结 oao
  4. Atitit.列表页面and条件查询的实现最佳实践(1)------设置查询条件and提交查询and返回json数据
  5. Paip.最佳实践-- Buildin variale 内建变量 ,魔术变量,预定义变量,系统常量,系统变量 1
  6. paip.语义分析--单字动词表.txt
  7. paip.python错误解决8
  8. paip.c#.net 多线程调用控件的问题
  9. paip.论.NET体系的优缺点).txt
  10. Gartner数据:RPA以75.6%增长率成2019年Q1增速最快的企业级软件(附全球十大RPA市场数据)