问题标签 [finalization]

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 投票
0 回答
130 浏览

java - finalize() 方法在执行过程中中断?

问题

我有一个URLClassLoader匿名课程。在其中,我重写了该finalize()方法,以便对象在垃圾收集时自动关闭:

我已经覆盖了close()打印一些信息的方法:

创建此对象后,我立即调用System.gc()销毁它。正如预期的那样,该finalize()方法被调用,然后该close()方法被调用,但我只看到Closing...打印到控制台。

为什么执行永远不会到达我的第二个打印语句?


笔记

我怀疑发生的第一件事super.close()是抛出异常,而为垃圾收集准备对象的任何东西都在吞下异常,所以我尝试捕获Throwable并打印它:

但是我得到了和以前一样的输出:Closing.... 我接下来要做的是测试如果我手动关闭类加载器会发生什么,所以我只是.close()在构建类加载器后立即调用它,而不是运行 System.gc(); 在这种情况下,我的两个打印语句都运行了:

0 投票
1 回答
58 浏览

c# - 为什么当终结队列使用大量内存时 GC 不运行?

我开始学习 GC 和 finalization,我遇到了一个非常简单的示例,其中应用程序的行为对我来说非常出乎意料。

(注意:我知道终结器只能用于非托管资源并使用一次性模式,我只是想了解这里发生了什么。)

这是一个简单的控制台应用程序,可生成“锯齿”模式的内存。内存上升到 90MB 左右,然后进行 GC,下降并再次开始上升,永远不会超过 90MB。

如果我用终结器删除注释,行为会非常不同——应用程序在开始时执行一到两次 GC,但随后内存以线性方式增加,直到它使用超过 1GB 的内存(此时我终止应用程序)

根据我的阅读,这是因为 GC 没有释放项目,而是将对象移动到终结队列。GC 启动一个线程来执行终结器方法,然后等待另一个 GC 移除终结对象。当终结器方法运行时间很长时,这可能是一个问题,但这里不是这种情况。

如果我每隔几次迭代手动触发一次运行 GC.Collect(),则应用程序会按预期运行,并且我会看到内存的锯齿模式被释放。

我的问题是 - 为什么应用程序使用的大量内存不会自动触发 GC?在包含终结器的示例中,GC 会在第一次之后再次运行吗?

0 投票
1 回答
53 浏览

oop - 如何强制定义析构函数

我想强制继承类在 Fortran >= 2008 中定义析构函数。

到目前为止,我已经尝试了以下几种变体:

甚至不编译。我如何实现这个目标?

0 投票
1 回答
188 浏览

java - 在其他对象之前防止对象垃圾收集

我有一个对其他对象的弱引用的弱引用数组,如下所示:

由于我现在不会讨论的原因,数组本身被弱引用。我想确保在任何 Bar 对象可以从它到达之前它不会被垃圾收集。换句话说,只要存在可以从中访问的任何 Bar 对象,它就必须存在于内存中。然后,如果不再存在 Bar 对象,那么最好对数组进行垃圾回收。(Bar 对象可能会或可能不会从其他地方强烈访问。)我通过引用所有 Bar 对象内的字段中的缓存数组来做到这一点。如果该字段足以使数组强可达,则不会被垃圾回收。但是,我的代码从未真正使用过该字段,我无法将其公开。(我收到“未使用”警告。)我担心此类字段的存在在编译时或运行时终止,

这是正确的解决方案吗?无论垃圾收集器或 JVM 实现如何,此解决方案都能实现我想要的吗?如果没有,有什么更好的方法?

0 投票
1 回答
75 浏览

c# - IDisposable, using 和 GarbageColleciton

我陷入了如何IDisposableGarbageCollector工作的杂草中。

假设您有一个IDisposable对象,它实际上并没有它所持有的资源(但该Dispose()方法在调用时会做一些事情)。并假设您在块的头部声明它using,但实际上并没有在块的过程中与对象交互。

我对GarbageCollection将如何运作有什么保证?

IE

注意:

  • MyConceptuallyDisposableObject 没有声明终结器/析构函数。
    • (假设开发人员永远不会忘记using`.Dispose()` 我的对象)
  • MyConceptuallyDisposableObject 不会GC.SuppressFinalise(this)在任何地方调用。

我是否保证object我构建的将:

  1. 以前不会.Dispose()叫过吧PointX
  2. 究竟会不会叫它.Dispose()呢? PointX
  3. 之前的任何时候都不会得到GarbageCollected/Finalized吗? PointX
  4. 在它调用它之前不会得到GarbageCollected/Finalized吗?.Dispose()

假设我然后更改我的代码以在其构造函数中进行MyConceptuallyDisposableObject调用。GC.SuppressFinalise(this)(请记住,没有任何析构函数或终结器)

  1. 这会改变上述具体问题的任何答案吗?
  2. 那么一般情况有什么变化吗?
  3. 这是否意味着GC永远不会清理我的对象并且我最终会出现内存泄漏?

*语境:*

为那些不可避免地好奇的人发布,但不要回答基于建议其他方法来实现这一点或我不应该这样做。现在,我更专注于从抽象意义上理解上述概念的内涵,而不是讨论我最初的尝试是否明智。

我想写一个DisposableAction()接受 2 Actions 的类。一种在您构建时执行,另一种在您构建时执行Dispose()

我以为我知道上述所有问题的答案(并且它们是“是”、“是”、“是”、“是”、“否”、“几乎没有,除非你对性能非常敏感”和“不”。),但我一直在尝试诊断一个似乎与这些信念相矛盾的错误。

0 投票
3 回答
77 浏览

c++ - C++ 自动终结或对象销毁

在这个例子中,我遇到了复制代码的问题:

Bnd 这里是一个糟糕的代码结构。如果我有很多构造,代码的宽度会太大,这也很糟糕:

如何保存好的代码结构并解决代码复制?Finalize1/2/3 是一个 API 函数,而不是我的程序类。也许一些 STL 容器可以解决它?也许是这样的?