首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Effective Java 读书笔记(7)避免finalizer

线程足够优先了 语言上的规范使得对于哪个线程来执行finalizer没有保证,故并没有便捷的方法来避免这个问题,所以避免使用finalizer还是比较实用的 不仅仅语言上的规范对finalizer的及时执行提供不了保证...,它同时也无法保证这些finalizer会全部被执行,一个程序不执行finalizer在某些已经不可达了的对象上而终止了的情况是绝对有可能存在的,故我们应该永不依赖于finalizer去更新一些严格持久的状态...如果一个类有一个finalizer并且一个子类重写了这个finalizer,这个子类必须人为手动地调用父类地finalizer,你应该在子类的try块里面去终结在finally里面调用父类的finalizer...(继承于Object会有一个不重要的finalizer,在这里可以忽略),所以对于一个子类的finalizer有没有调用父类的finalizer的方法已经变得无关紧要了,这种技术对于每一个非final的拥有一个...当你使用finalizer在那些罕见的实例之中,记得调用父类的finalize。如果你想当成安全网来使用的话,记得去log那些对于finalizer无效的使用。

48820

java中的reference(三): FinalReference和Finalizer的源码分析

Finalizer Finalizer是finalReference的子类,对queue和lock进行了重写。Finalizer也是protected作用域,另外通过final修饰。不可被继承。...Finalizer生命周期如下: 在创建对象的时候,如果重写了finalize方法,jvm就会同时创建一个Finalizer对象。...所有的Finalizer对象构成一个双向链表 所有的Finalizer对象都有一个名为queue的ReferenceQueue队列 GC在执行标记的最后阶段,会把Finalizer的对象加入到Reference...Finalizer中有一个专门的守护线程 Finalizer Thread,这个线程中有一个死循环,专门从queue中取出对象,并执行Finalizer中引用对象的finalize方法。...总结 结合前文,不难发现Finalizer在GC过程中会存在如下结论: 对象如果有finalizer方法,那么就会被Finalizer临时强引用,而变成一强引用的话,是无法被立即回收的。

67620
您找到你想要的搜索结果了吗?
是的
没有找到

Java中弱引用、软引用、虚引用、强引用、 Finalizer引用

= ReferenceQueue.NULL) q.enqueue(r); return true; } Finalizer引用   Finalizer继承Reference,Finalizer...任何类只要实现了Object类里的finalize方法,JVM在初使化这个对象的时候(调用构造方法的时候),会构造一个Finalizer对象,通过调用Finalizer的register方法,代码如下:...在构造方法里,会调用add方法,将Finalizer对象加入到链表里,代码如下: ? ?...何时被加入到ReferenceQueue里   当gc发生的时候,gc算法会判断对象是不是只被Finalizer类引用,如果这个类仅仅被Finalizer对象引用的时候,说明这个对象在不久的将来会被回收了现在可以执行它的...finalize方法了,于是会将这个Finalizer对象放到Finalizer类的ReferenceQueue里,但是这个f类对象其实并没有被回收,因为Finalizer这个类还对他们持有引用,在gc

2K30

闲话资源管理

一般情况下如果对象存在 finalizer 时 GC 会在判定该对象为垃圾后择机调用 finalizer 。...因此 finalizer 只能保证非托管资源最终可以被释放,但是不保证在何时释放。并且大量依赖 finalizer 会降低程序的性能,这是因为垃圾回收器需要执行更多的工作才能最终终结这些资源。...GC 清理带有 finalizer 的垃圾对象是这么做的:首先 GC 会在每个周期内把包含 finalizer 但还没有执行的对象放在队列中,在下一个周期里 GC 会清理掉已经执行过 finalizer...的对象,这其中执行对象 finalizer 的线程并不是 GC 所在的线程。...100 个周期才会判断一次,因此具有 finalizer 的对象最少需要 GC 执行 10 个周期才会清理,而不具有 finalizer 的对象最多 9 个周期就会被清理。

83520

Java高级编程:Finalize 引发的内存溢出

("Finalizer-->finalize()"); } public static void main(String[] args) { Finalizer f = new Finalizer...图片 Finalizer 守护线程 在 GC 完成后,JVM 才会意识到除了 Finalizer 对象已经没有人引用到我们创建的这些实例了,它才会把指向这些对象的 Finalizer 对象标记成可处理的...在 finalizer 执行过程中通过 jstack 查询 Threads dump 可以看到与 Finalizer 守护线程相关的线程信息: "Finalizer" #3 daemon prio=8 ...一旦 Finalizer 线程发现队列中出现了新的对象,它会弹出该对象,调用它的 finalize() 方法,将该引用从 Finalizer 类中移除,因此下次 GC 再执行的时候,这个 Finalizer...这些对象都有各自的看门狗也就是 Finalizer,而这个 Finalizer 对象会被添加到一个 java.lang.ref.Finalizer.ReferenceQueue 中。

2.2K30

Kubernetes Operator Finalizers 使用

存在 Finalizers 字段的的资源对象接收的第一个删除请求设置 metadata.deletionTimestamp 字段的值, 但不删除具体资源,在该字段设置后, finalizer 列表中的对象只能被删除...有以下几点需要理解: 如果资源对象未被删除且未设置 finalizers,则添加 finalizer并更新 k8s 资源对象; 如果正在删除资源对象并且 finalizers 仍然存在于 finalizers...且与上述声明的 finalizer 匹配,那么执行对应 hook 逻辑 if err := r.deleteExternalResources(cronJob); err !...k8s-initializer-finalizer-practice 在搜索相关资料的时候,看到有人在 SO 上问了如何使用的问题,其中有个回答中附上了一个练习项目,项目很小,很适合了解 Finalizers...= nil{ // check if it has finalizer if customdeployment.GetFinalizers()!

1.8K50

JVM 系列(6)吊打面试官:为什么 finalize() 方法只会执行一次?

认识 Finalizer 机制 1.1 为什么要使用 Finalizer 机制? Java 的 Finalizer 机制的作用在一定程度上是跟 C/C++ 析构函数类似的机制。...1.2 Finalizer 存在的问题 虽然 Java Finalizer 机制是起到与 C/C++ 析构函数类似的作用,但两者的定位是有差异的。...因此,当大量不可达对象的 Finalizer 机制没有及时执行时,就有可能造成大量资源来不及释放,最终耗尽资源; 问题 2 - Finalizer 机制不保证执行: 除了执行时机不稳定,甚至不能保证 Finalizer...这与 Finalizer 机制的实现原理有关,后文我们将深入虚拟机源码,从源码层面深入理解。 1.3 什么时候使用 Finalizer 机制?...由于 Finalizer 机制存在不稳定性,因此不应该将 Finalizer 机制作为释放资源的主要策略,而应该作为释放资源的兜底策略。

59610

在Java虚拟机上班是一种怎样的体验?

如果发现有finalize方法,以后创建这个类的所有对象都会附带创建一个Finalizer对象。...这个Finalizer有两个关键点: 继承自Reference类,本身也是一个引用,引用的正是跟它一起创建的那个对象 里面有一个名叫queue的成员,指向了一个队列:ReferenceQueue,正是Finalizer...除此之外,Finalizer里面还有一个静态线程FinalizerThread,这个其实就是我了。我的工作就是不断上面的队列里面取出Finalizer对象,然后执行它引用对象的finalize方法。...你问我Finalizer对象是什么时候进入这个队列里的?这我就不知道了,超出了我的工作范围,可以请 @ReferenceHandler 帮忙解答一下。 以上。...有了这些信息,创建对象的时候就可以检查标记来决定是否创建Finalizer对象了。 以上。 ReferenceHandler JVM核心员工,GC部门高级工程师。

29410

熟悉又陌生的 k8s 字段:finalizers

对带有 Finalizer 的对象的第一个删除请求会为其 metadata.deletionTimestamp 设置一个值,但不会真的删除对象。...当 metadata.deletionTimestamp 字段被设置时,负责监测该对象的各个控制器会通过轮询对该对象的更新请求来执行它们所要处理的所有 Finalizer。...当所有 Finalizer 都被执行过,资源被删除。 metadata.deletionGracePeriodSeconds 的取值控制对更新的轮询周期。...每个控制器要负责将其 Finalizer 从列表中去除。 每执行完一个就从 finalizers 中移除一个,直到 finalizers 为空,之后其宿主资源才会被真正的删除。...return forget, nil} 如果 Phase 状态为 Destroyed,则从 Finalizers 中移除 finalizer.chaosblade.io,之后正常删除 CR。

5K31

关于Reference的与finalize的一点思考和研究

背景 最近读了寒泉子关于Finalizer的分享 JVM源码分析之FinalReference完全解读 - InfoQ 结合之前对java引用类型的了解,突然想到几个开脑洞的问题: 如果一个对象没有强引用...,并执行对象的finalize方法(注意:此时对象引用还在,所以逃过一次GC) 实验思路 我们是想验证各个引用类型进入队列的顺序,所以需要绑定到同一个ReferenceQueue,实现方式是利用反射把Finalizer...> cls = Class.forName("java.lang.ref.Finalizer"); Field[] fields = cls.getDeclaredFields();...= null && ref.getClass().getSimpleName().equals("Finalizer")) { //Finalizer代替Finalizer线程执行runFinalizer...,则在SoftReference和WeakReference放入队列后再放入队列,这时候强引用还在Finalizer中,执行完finalize方法才可能被解除 finalize执行完后,下一次GC才会把

86630
领券