首页
学习
活动
专区
圈层
工具
发布
    • 综合排序
    • 最热优先
    • 最新优先
    时间不限
  • 来自专栏MyBlog

    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无效的使用。

    67120发布于 2018-09-13
  • 来自专栏做不甩锅的后端

    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临时强引用,而变成一强引用的话,是无法被立即回收的。

    95020发布于 2020-08-03
  • 来自专栏java、Spring、技术分享

    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

    2.7K30发布于 2018-12-24
  • 来自专栏全栈程序员必看

    java中finalized的用法_java中的引用类型

    Finalizer对象放入到一个引用队列:java.lang.ref.Finalizer.ReferenceQueue. Finalizer对象怎么被清理的呢 JVM默认会创建一个finalizer线程来处理Finalizer对象,如果你去抓取线程堆栈的话可以看到这个线程的堆栈,如下所示: 8″Finalizer” daemon (finalizer.java:5) at java.lang.ref.Finalizer.invokeFinalizeMethod(Native Method) at java.lang.ref.Finalizer.runFinalizer (Finalizer.java:83) at java.lang.ref.Finalizer.access$100(Finalizer.java:14) at java.lang.ref.Finalizer 对象都放到引用队列中,并依次调用了对象的finalize方法,内存中java.lang.ref.FinalizerFinalizer对象依然存在,不过这一java.lang.ref.Finalizer

    2.5K10编辑于 2022-10-02
  • 来自专栏centosDai

    CA1821:移除空终结器

    public class Class1 { // Violation occurs because the finalizer is empty. . // The finalizer will contain code only if the DEBUG directive // symbol is present When the DEBUG // directive is not present, the finalizer will still exist, but // it ~Class2() { Debug.Fail("Finalizer called!") ~Class3() { Debug.Fail("Finalizer called!"); } #endif }

    38800编辑于 2022-02-19
  • 来自专栏聊聊Netty那些事儿

    FinalReference 如何使 GC 过程变得拖拖拉拉

    () 方法判断这个 Java 类有没有重写 finalize() 方法,如果重写了就会调用 register_finalizer 方法,JVM 最终会调用 JDK 中的 Finalizer 类的静态方法 new Finalizer(finalizee); } } 在这里 JVM 会将刚刚创建出来的普通 Java 对象 —— finalizee,与一个 Finalizer 对象关联起来, Finalizer Finalizer 的整体设计和之前介绍的 Cleaner 非常相似,不同的是 Cleaner 是一个 PhantomReference,而 Finalizer 是一个 FinalReference。 Finalizer unfinalized = null; private Finalizer next, prev; private Finalizer(Object finalizee 当这个 ReferenceQueue 有了 Finalizer 对象之后,FinalizerThread 线程就会被唤醒,然后执行 Finalizer 对象的 runFinalizer 方法。

    37210编辑于 2024-06-18
  • 来自专栏喵叔's 专栏

    闲话资源管理

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

    1.3K20发布于 2020-09-08
  • 来自专栏golang算法架构leetcode技术php

    golang源码分析:runtime.SetFinalizer

    func SetFinalizer(obj any, finalizer any) { 的定义位于src/runtime/mfinal.go。详细信息可以看下它的注释,很完备。 在第一次回收时执行 Finalizer 函数,且目标对象重新变成可达状态,直到第二次才真正 “销毁”。 runtime.SetFinalizer(&i, func(i *int) { fmt.Println(i, *i, "set finalizer") }) runtime.GC( ) time.Sleep(time.Second * 1) runtime.GC() //0xc000018168 3 set finalizer subFunc() time.Sleep (time.Second * 1) runtime.GC() //0xc000018180 3 set sub finalizer } func subFunc() { // i 就是后面说的

    70420编辑于 2023-09-06
  • 来自专栏福大大架构师每日一题

    2023-05-26:golang关于垃圾回收和析构函数的选择题,多数人会选错。

    // finalizer function. and runs// finalizer(obj) in a separate goroutine. This makes obj reachable again,// but now without an associated finalizer. with a finalizer, that// cycle is not guaranteed to be garbage collected and the finalizer// is not with a finalizer, that// cycle is not guaranteed to be garbage collected and the finalizer// is not

    44500编辑于 2023-05-26
  • 来自专栏用户4480853的专栏

    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 中。

    3.2K30编辑于 2022-11-07
  • 来自专栏彭旭锐

    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 机制作为释放资源的主要策略,而应该作为释放资源的兜底策略。

    1K10编辑于 2022-09-26
  • 来自专栏SnailTyan

    Effective Java 2.0_中英文对照_Item 7

    If a class (other than Object) has a finalizer and a subclass overrides it, the subclass finalizer must invoke the superclass finalizer manually. Instead of putting the finalizer on the class requiring finalization, put the finalizer on an anonymous If you use a finalizer as a safety net, remember to log the invalid usage from the finalizer. Lastly, if you need to associate a finalizer with a public, nonfinal class, consider using a finalizer

    46910编辑于 2022-05-09
  • 来自专栏程序猿人

    java强引用、软引用、弱引用、虚引用以及FinalReference

    SoftReference//软引用 * WeakReference//弱引用 * PhantomReference//虚引用 * FinalReference *Finalizer FinalReference灰常简单(就一个传统的引用类都有的构造),我们看下他的子类:Finalizer。 JVM在新建F类的对象时,调用Finalizer.register方法。 register方法,会新建一个指向该对象的强引用,这样它就不会被垃圾回收了。 tg); finalizer.setPriority(Thread.MAX_PRIORITY - 2); finalizer.setDaemon(true); f = (Finalizer)queue.remove();//从引用队列取出Finalizer类 f.runFinalizer(jla);// 从Finalizer的引用中剥离对象

    1.4K10发布于 2020-08-11
  • 来自专栏爬蜥的学习之旅

    java中的引用对象

    = null; tg = tgn, tgn = tg.getParent()); Thread finalizer = new FinalizerThread( tg); finalizer.setPriority(Thread.MAX_PRIORITY - 2); finalizer.setDaemon(true); finalizer.start(); } 值得注意的是,Finalizer它本身的构造函数是private,只能通过虚拟机自身来执行register操作,具体的时机根据RegisterFinalizersAtInit oop_is_instanceMirror(), "wrong allocation path"); bool has_finalizer_flag = has_finalizer(); // Query 即通过Finalizer找到的register methodHandle mh (THREAD, Universe::finalizer_register_method()); JavaCalls

    2.7K30发布于 2019-07-09
  • 来自专栏k8s技术圈

    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()!

    2.1K50发布于 2020-11-04
  • 来自专栏Kubernetes

    Kubernetes GC in v1.3

    由4个模块组成:Scanner,Garbage Processor,Propagator and Finalizer,其结构图如下: ? ###Finalizers: Like a controller, a finalizer is always running. A finalizer doesn't need to be registered with the API server. finalizer from ObjectMeta.Finalizers. ###the "orphan" finalizer: Watches for update events as described in "Finalizer" Chapter.

    98661发布于 2018-04-13
  • 来自专栏全栈程序员必看

    java finalize 作用_java中的finalize方法有什么作用「建议收藏」

    public class Finalizer { @Override protected void finalize() throws Throwable { System.out.println (“Finalizer–>finalize()”); } public static void main(String[] args) { Finalizer f = new Finalizer() ; f = null; } } //无输出public class Finalizer { @Override protected void finalize() throws Throwable { System.out.println(“Finalizer–>finalize()”); } public static void main(String[] args) { Finalizer f = new Finalizer(); f = null; System.gc();//手动请求gc } } //输出 Finalizer–>finalize() 2 什么时候应该使用它 finalize

    1.1K20编辑于 2022-10-02
  • 来自专栏编程技术宇宙

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

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

    43710发布于 2020-07-27
  • 来自专栏MoeLove

    熟悉又陌生的 k8s 字段:finalizers

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

    6.3K41发布于 2020-09-23
  • 来自专栏D·技术专栏

    简单的"Hello Word"用了几个线程

    5:Monitor Ctrl-Break 4:Signal Dispatcher 3:Finalizer 2:Reference Handler 1:main java 运行文件 $javac HelloDemo.java 4:Signal Dispatcher 3:Finalizer 2:Reference Handler 1:main Reference Handler : 处理对象引用本身的垃圾回收 Finalizer : 处理用户的finalizer方法 Signal Dispatcher :外部jvm命令转发器 IDEA 工具多了一个Monitor Ctrl-Break线程,Debug模式下不会有。

    81910发布于 2019-11-19
领券