问题标签 [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 投票
1 回答
100 浏览

c# - 垃圾收集概念

Finalize() -此函数仅在垃圾收集过程中
清理非托管资源
-用户不知道此方法何时实际执行。
用户也不能直接调用这个函数来清理内存。

Dispose() -
通过实现 IDisposable 接口,用户可以清理非托管资源,用户将确切知道何时释放资源。

我的理解是 Finalize() 不能被覆盖以清理非托管资源。
这是一个仅用于“GC”进程的系统进程,用于清理非托管资源。
如果用户需要自己清理资源,那么他/她应该实现 IDisposable 接口并显式调用 Dispose()。没有其他可能!
清理非托管资源的最佳做法是使用“USING”语句。

问题1: 我的理解正确吗?如果我错了,请在我的上述陈述中纠正我。

问题 2:另外,我想知道,我可以通过实现 IDisposable 接口和调用 Dispose() 来 清理托管资源吗?

0 投票
1 回答
615 浏览

.net - Why is it preferred to not use finalize for clean up? .NET

(Windows API created objects, File, Database connection objects, COM objects, etc.) are outside the scope of .NET Framework. We have to explicitly clean our resources. For these types of objects, .NET Framework provides Object.Finalize method, which can be overridden and clean up code for unmanaged resources...

  1. Why is it preferred to not use finalize for clean up?

  2. What is appropriate to use?

0 投票
1 回答
31 浏览

java - 在 getter 中创建新对象,确保它不在 VM 中

我创建了一个非常简单的应用程序来请求项目、工具等等。我使用数据库来保存所有这些信息。我的申请管理器类使用一个 getter,它使用数据库中的信息返回一个新的申请实例。这个新对象会永远在堆栈中吗?我怎样才能强制它被收集?我怎样才能使它变得更好,例如如何在不创建新对象的情况下编写函数?

0 投票
1 回答
60 浏览

java - 为什么 Finalize 方法的 SOP 没有显示在以下程序的结果中,请解释一下?

0 投票
2 回答
605 浏览

java - 搞砸 java finalize()

我读到 JVM gc 在找到一个无法访问的对象后运行该对象的 finalize() 方法。然后它检查对象是否仍然无法访问,如果不是,则将其删除。所以我写了一个finalize,使它的对象的引用再次可用:

下面是主要方法:

运行 gc,因为“A stuff is finalized”出现在标准输出上,但 main 中的 printline 之后会引发 IndexOutOfBoundsException。我可以完成这项工作吗?

我通常根本不使用 finalize,我只是觉得看看 finalize 是否可以使其对象的引用再次可用会很有趣。我可以做这个工作吗?

0 投票
2 回答
928 浏览

java - Why finalize() is not called?

I want to check the condition in termination with finalize, but finalize never be executed each time. Can anybody tell me why?

0 投票
4 回答
488 浏览

java - 何时执行 finalize()?

在一次采访中,有人问我,假设 JVM 在不使用 A 类的对象时运行 gc。

它是否保证 finalize() 的执行。我说是

下一个问题是是否正在使用 Class A 的 obj,如果现在 JVM 运行 GC,它是否执行 finalize()。我说不,它不会执行这个 finalize() 因为 JVM 不收集 A 的对象。

然而,她没有发表任何评论,但看起来很失望。

我解释错了吗?提前致谢

0 投票
3 回答
201 浏览

java - 我可以假设用户线程和 Java 中的 finalize 线程之间没有数据竞争吗

考虑以下 Java 类:

X.foo()在从未从任何方法(直接或间接)调用的假设下,finalize()我可以确定上面的代码没有数据竞争,也就是说,我可以确定在实际情况下X.finalize()看到写入的值叫?X.foo()X.foo()

天真的分析会说X.finalize()不能同时运行X.foo()(由于提到的假设),所以不需要额外的同步。

我猜上面的代码没有数据竞争,但令我困扰的是,语言规范在§17.4.5中包含以下明确声明,但没有说明 finalize() 和一般方法之间的发生前关系:

从对象的构造函数的末尾到该对象的终结器(第 12.6 节)的开头有一条发生前边缘。

编辑:我认为有必要使我的问题更精确,所以这里尝试对问题进行精确的重新表述:

Java 是否保证特定方法之间的发生之前的X.foo()关系,X.finalize()如果我保证X.foo()永远不会从任何finalize()方法调用(直接或间接)?在这里,happens-before将完全按照§17.4.5中的定义进行解释。

0 投票
0 回答
660 浏览

.net - Thread.Abort 和 App 崩溃

我发现我的程序有些奇怪

该程序正常终止,但是,如果我取消注释 Main 中打印“System.Data.SqlTypes.SqlInt32”类型的第一个代码行,程序将在退出时崩溃,并且 windows 事件告诉我“访问冲突”(0xc0000005 )

我发现它与线程中止有关,但是谁能解释为什么在终结器中中止“工作”线程会导致崩溃,而在其他线程中这会很好地工作?

经过一些实验,我发现不是打印'System.Data.SqlTypes.SqlInt32',任何可以引入加载System.Data.dll的代码都会使该程序异常终止。有什么关系?

需要注意的是,根据我的测试,崩溃仅发生在 Windows 2008R2 或 win 7 上的 .NET 4.0 上。对于其他版本的 .NET,如 3.5 或 4.5,或 Windows XP 等操作系统,它会正常终止。

先感谢您!

0 投票
2 回答
78 浏览

java - Java:参考对象的 API 文档需要澄清

我了解了 Java 中引用对象的要点,以及软引用对象、弱引用对象和幻像引用对象之间的基本区别。

但是,我不完全理解 API 文档中的以下几点

  1. 来自WeakReference<T>的 API 文档:

    “弱引用对象,不会阻止它们的引用对象被最终化,最终化,然后被回收。”

    现在, API 文档中的任何地方都没有解释粗体字的术语,所以我想知道它们的确切含义,特别是与或多或少不推荐使用Object.finalize()的方法的终结概念有关。

  2. 来自Reference<T>的 API 文档:

    public void clear()“此方法仅由 Java 代码调用;当垃圾收集器清除引用时,它会直接清除引用,而不调用此方法。”

    public boolean enqueue()“此方法仅由 Java 代码调用;当垃圾收集器将引用入队时,它直接这样做,而不调用此方法。”

    同样,我不知道上面 2 句引号中的“Java 代码”是什么意思:我无权访问的 JVM 内部代码?或者,我具有只读/浏览访问权限的 JDK 代码?或者,最终用户自己的 Java 代码?

    直接,不调用这个方法”部分告诉我JVM不需要调用这些方法。另一方面,“仅由 Java 代码”部分告诉我,它不是最终用户的 Java 代码,而是 JVM 的(如果它意味着最终用户代码,那么我们会发现这个短语在所有几乎每个 Java 类的每个方法的 API 文档!)。那么哪种解释是正确的,谁能调用这个函数呢?