问题标签 [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.

0 投票
4 回答
2751 浏览

java - 优雅地完成 SoftReference 引用

我正在使用一个搜索库,它建议保持搜索句柄对象打开,这样可以使查询缓存受益。随着时间的推移,我观察到缓存趋于膨胀(几百兆并不断增长)并且 OOM 开始出现。没有办法强制这个缓存的限制,也没有计划它可以使用多少内存。所以我增加了Xmx限制,但这只是临时解决问题的方法。

最终我想使这个对象成为. java.lang.ref.SoftReference因此,如果系统的可用内存不足,它会释放对象并按需创建一个新对象。这会在重新开始后降低一些速度,但这是一个比 OOM 更好的选择。

我看到的关于 SoftReferences 的唯一问题是没有明确的方法可以最终确定它们的所指对象。就我而言,在销毁搜索句柄之前,我需要关闭它,否则系统可能会用完文件描述符。显然,我可以将此句柄包装到另一个对象中,在其上编写终结器(或挂钩到 ReferenceQueue/PhantomReference)然后放手。但是,嘿,这个星球上的每一篇文章都建议不要使用终结器,尤其是 - 反对使用终结器来释放文件句柄(例如Effective Java ed. II,第 27 页。)。

所以我有些不解。我是否应该小心忽略所有这些建议并继续前进。否则,还有其他可行的替代方案吗?提前致谢。

编辑#1:按照 Tom Hawtin 的建议测试了一些代码后添加了以下文本。对我来说,似乎任何一个建议都不起作用,或者我错过了一些东西。这是代码:

如果我使用-Xmx10m和 SoftReferences 运行上面的代码片段(如上面的代码),我会得到大量的is null :(打印。但是,如果我用MyReference(用 MyReference 取消注释两行并用 SoftReference 注释掉两行)替换代码,我总是会得到 OOM。

正如我从建议中了解到的那样,内部有硬引用MyReference不应该阻止物体撞击ReferenceQueue,对吧?

0 投票
1 回答
971 浏览

c# - C# 自动保存清理;最佳实践?

我有一个代表文档的类(GH_Document)。GH_Document 上有一个 AutoSave 方法,该方法在每次潜在危险操作之前调用。此方法在原始文件旁边创建(或覆盖)一个 AutoSave 文件。

GH_Document 还包含一个名为 DestroyAutoSaveFiles() 的方法,该方法从磁盘中删除由 AutoSave 函数创建的所有文件。当应用程序关闭时,我在文档上调用此方法,以及当文档被卸载时。但是,我似乎错过了一些案例,因为在一些成功关闭后自动保存文件仍然存在。

所以这让我开始思考。处理这种情况的最佳方法是什么?我是否应该追踪文档消失的所有可能方式并在各处添加自动保存清理逻辑?或者我应该实现 IDisposable 并在 GH_Document.Dispose() 中执行清理?或者我应该在 GH_Document.Finalize() 中这样做吗?

我希望自动保存文件保留在磁盘上的唯一一次是应用程序崩溃时。是否保证在发生崩溃时不会调用 Dispose 和 Finalize?

0 投票
4 回答
88791 浏览

xcode - 如何从 Xcode 导出完成的应用程序?

不得不问这个我觉得很傻。我有一个应用程序,我想向某人发送一个测试版以在他们的机器上进行测试,但我不知道如何让 Xcode 生成一个.app文件供我发送给他们。帮助?

0 投票
3 回答
1598 浏览

c# - System.Object 类中的 Finalize 方法

出于好奇,我反汇编了 mscorlib.dll 以检查 System.Object 类的实现。

我在其中发现了一些奇怪的东西。

为什么基类中有一个重写的方法?

我只是想知道 Object 类中“受保护的 Finalize”方法的用途是什么,为什么编译器会对它进行特殊处理?

0 投票
4 回答
395 浏览

c# - 区别 b/w 析构函数和 finalize 方法

我想知道这些函数的调用顺序。就像我们的堆满了,GC 就会被调用。它将标记对象并调用其终结操作,现在我们有扫描阶段.. 在该阶段对该对象的引用被删除并且对象变得不可访问.. 那么销毁在哪里进入循环......当它被调用时。 .那它在做什么....

0 投票
9 回答
39345 浏览

java - 为什么 java.lang.Object 中的 finalize() 方法是“受保护的”?

出于好奇,

为什么将finalize()方法的访问修饰符设为protected. 为什么不能呢public?有人可以解释一下这背后的任何具体原因吗?

另外,我知道该finalize()方法只被调用一次。如果我在内部程序中调用它两次,会发生什么?垃圾收集器会再次调用它吗?

0 投票
5 回答
25062 浏览

java - Java中终结的目的是什么?

我对定稿的理解是这样的:

为了清理或回收对象占用的内存,垃圾收集器开始行动。(自动被调用?)

然后垃圾收集器取消引用该对象。有时,垃圾收集器无法访问对象。然后调用 finalize 进行最终清理处理,之后可以调用垃圾收集器。

这是对最终确定的准确描述吗?

0 投票
17 回答
513273 浏览

java - Java 什么时候调用 finalize() 方法?

我需要知道何时finalize()JVM. finalize()我创建了一个测试类,该类在通过覆盖调用该方法时写入文件。它不被执行。谁能告诉我它没有执行的原因?

0 投票
2 回答
3252 浏览

java - java:所有线程终止后关闭连接

以下是我的课程代码

这只能通过 getDatabase() 方法来初始化数据库对象。下面是对 4 个线程使用单个数据库连接的程序。

执行完所有线程后,我需要关闭连接。有什么好主意吗。请帮助我完成这项工作。

0 投票
6 回答
3708 浏览

java - Java:在finalize方法上写入文件

据我了解,单例对象仅在应用程序即将终止时才会销毁。因此,在 C++ 中,我编写了一个 Singleton 类来记录我的应用程序,并在该 Singleton 记录器的析构函数中记录我的应用程序终止的时间。事情在 C++ 中完美运行。


现在我想在 Java 中使用相同的记录器,因为在 Java 中没有析构函数,所以我为该单例记录器实现了 finalize 方法。但似乎 finalize 方法实际上从未被调用过。因此,我System.runFinalizersOnExit(true);在代码中的某处添加了该行(尽管我知道它已被弃用),并且每次在应用程序终止之前都会调用该 finalize 方法。但是还是有问题!如果我尝试在该 finalize 方法中写入任何文件,它不起作用,尽管 System.out 工作没有任何问题!:(

你们能帮我解决这个问题吗?这是我尝试做的示例代码:

单例记录器类:

主要的: