问题标签 [finalize]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - Java 终结器守护者似乎不起作用?
我有一个带有 finalize() 方法的伸缩构造函数的超类。为了防止子类忘记调用 super.finalize,我编写了一个像这样的终结器守护程序(EJ Item 7)。
这是一个示例子类——
当 s1 对象超出范围时,终结器监护人的 finalize() 被调用,我从子类的 finalize 方法中获取 SYSO,但从不从 super 的 finalize 中获取。
我很困惑。我从根本上误解了什么吗?
免责声明:我意识到终结器是危险的,不可取的,等等。仍然试图理解这里的问题。
java - Java中的终结队列
是不是只有当一个类有一个finalize()
方法时,只有那个对象,当不可达时,才会被添加到终结队列中?原因是我正在浏览此链接
,并且在“子类化时避免内存保留问题”类别中,它说大型数组在finalize()
被调用之前不可用于垃圾收集。但我的观点是,即使我不编写finalize()
方法,它仍然必须等待对象在终结队列中出列。
android - Android MediaScanner finalize()
在 Gingerbread 2.3.4 中,有时SDCard 的卸载失败。当我检查日志时,mediaserver仍在访问sdcard中的一些文件,甚至vold throw SIGKILL at mediaserver,mediaserver将变成僵尸进程,卸载操作仍然会失败。
我认为失败的原因是MediaScanner仍然持有对对象的引用,这些对象持有对 sdcard 中文件的引用。MediaScanner在MediaProvider中用于从媒体文件中提取专辑封面。但是,即使提取专辑封面操作已经完成,MediaScanner 仍然没有被 Garbage Collector 释放。而当在这种状态下进行卸载操作时,卸载操作肯定会失败。在卸载 SDCard 之前释放 MediaScanner 不会失败。
我所做的是我在MediaScanner类中添加了一个release()函数,一旦完成提取专辑封面,它将由MediaProvider调用。在 release() 函数内部,它将调用native_finalize()。更改后,我能够成功卸载 SDCard。
在MediaScanner的原始源代码中,MediaScanner引用的对象在finalize()函数内部释放。
你们中有人遇到过和我一样的问题吗?除了我上面提到的还有其他解决方法吗?
任何反馈将不胜感激。
问候,
艺术
java - 在 Java 中,关键字 `final`、`finally` 和 `finalize` 的用途是什么?
在 Java 中,关键字final
,finally
和finalize
实现什么目的?
java - 如何实现对象的有保证的最终确定行为
我想在一个对象上实现一个类似于 Java 语言中的保证 finalize() 的行为。我希望在垃圾收集发生之前执行一些语句。请注意 finally 块在这里没有用,因为 finally 在 try 块之后运行,这不是我的要求。基本上我想在对象从 JVM 堆中卸载之前对其进行序列化。请指教。
python - IronPython - 在 sys.exit() 上正确分配资源
调用 sys.exit() 时正确完成 python 脚本的最佳方法是什么?
例如,我有一个应用程序: - 打开日志文件 - 打开一些 USB 小工具 - 决定是时候关闭应用程序 - 调用 sys.exit(-1) - (或者它抛出严重的异常 - 但我更喜欢第一种方式,因为我有点小猪,代码的某些部分实际上捕获了所有异常,这将停止我的终止异常......)
然后我需要一些 finalize() 函数,在退出解释器之前肯定会调用它。Finalize() 将按此顺序释放 USB 小工具并关闭日志文件。
我尝试了 def del但它没有被 sys.exit 调用,而且我无法决定 _ del _s 的调用顺序。
对我有什么救赎吗?还是我必须这样做: 1. 最重要的 try-catch-finally 2. 退出是否带有一些特定的异常 3. 每个异常捕获的任何地方都准确地指定了我正在捕获的内容?
java - 释放类加载器时,何时在单例上调用 finalize?
“已发布”是指没有对剩余类加载器的引用。
我们遇到了一个问题,经常重新部署的 Java EE 应用程序会占用 permgen 空间。分析表明,Java EE 应用程序中的单例已经传递了对应用程序外部应用程序类加载器对象的引用(违反了 Java EE 规则),并且在取消部署应用程序时没有清除它们。
假设没有其他对单例或类对象的引用,当其类的类加载器被释放时,单例的 finalize() 是否会被调用? 我想清除那里的流氓入站引用。或者我是否在一个 catch-22 中,直到类加载器本身可以被垃圾收集之前,finalize 才会被调用——因此永远不会因为流氓外部引用而被调用?
这里的主要问题可能是:
在这种情况下,类对象的类加载器还不能被垃圾收集吗? 这可能取决于类加载器行为的规范,或者可能取决于实现。
参考(另一种!;-))将不胜感激,但不是必需的。
java - 为什么在这个单元测试中没有调用 finalize 函数?
我正在尝试编写一个 Java 单元测试来测试调用终结器对对象的影响。
为了确保调用终结器,我使用了我在 stackoverflow 其他地方看到的 WeakReference 方法。
我的问题是,在这个测试中,TestFinalizer 的 finalize 方法永远不会被调用,即使 WeakReference 在一次迭代后出现 null :
java - finalize() 在 java 中是如何工作的?
所以,我最近在 Java 中发现了 finalize 方法(不知道为什么我之前错过了它,但它确实存在)。这似乎可以解决我正在处理的许多问题,但我想先获得更多信息。
在网上,我找到了这张图,说明了垃圾收集和完成的过程:
几个问题:
- 这发生在一个单独的线程中,对吗?
- 如果我在 finalize 期间实例化一个新对象会发生什么?这是允许的吗?
- 如果我从 finalize 调用静态方法会发生什么?
- 如果我从 finalize 中建立对对象的新引用会发生什么?
我想我应该解释一下我为什么感兴趣。我经常使用 LWJGL,似乎如果我可以使用 finalize 使 Java 对象自动清理 OpenGL 资源,那么我可以在 API 方面做一些非常好的事情。
java - java中 System.gc() 和 finalize() 方法有什么区别?
我在 java 的 system.gc() 和 finalize() 方法之间感到困惑。我们不能强制将垃圾对象收集到 JVM。我们允许在我们的java代码中编写这两种方法,那么如果两者都用于垃圾收集,那么提供两种java垃圾收集方法有什么意义呢?
请告诉我这两种方法的确切工作原理以及它在内部是如何工作的?