问题标签 [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.
java - finalize() 方法在执行过程中中断?
问题
我有一个URLClassLoader
匿名课程。在其中,我重写了该finalize()
方法,以便对象在垃圾收集时自动关闭:
我已经覆盖了close()
打印一些信息的方法:
创建此对象后,我立即调用System.gc()
销毁它。正如预期的那样,该finalize()
方法被调用,然后该close()
方法被调用,但我只看到Closing...
打印到控制台。
为什么执行永远不会到达我的第二个打印语句?
笔记
我怀疑发生的第一件事super.close()
是抛出异常,而为垃圾收集准备对象的任何东西都在吞下异常,所以我尝试捕获Throwable
并打印它:
但是我得到了和以前一样的输出:Closing...
. 我接下来要做的是测试如果我手动关闭类加载器会发生什么,所以我只是.close()
在构建类加载器后立即调用它,而不是运行 System.gc(); 在这种情况下,我的两个打印语句都运行了:
c# - 为什么当终结队列使用大量内存时 GC 不运行?
我开始学习 GC 和 finalization,我遇到了一个非常简单的示例,其中应用程序的行为对我来说非常出乎意料。
(注意:我知道终结器只能用于非托管资源并使用一次性模式,我只是想了解这里发生了什么。)
这是一个简单的控制台应用程序,可生成“锯齿”模式的内存。内存上升到 90MB 左右,然后进行 GC,下降并再次开始上升,永远不会超过 90MB。
如果我用终结器删除注释,行为会非常不同——应用程序在开始时执行一到两次 GC,但随后内存以线性方式增加,直到它使用超过 1GB 的内存(此时我终止应用程序)
根据我的阅读,这是因为 GC 没有释放项目,而是将对象移动到终结队列。GC 启动一个线程来执行终结器方法,然后等待另一个 GC 移除终结对象。当终结器方法运行时间很长时,这可能是一个问题,但这里不是这种情况。
如果我每隔几次迭代手动触发一次运行 GC.Collect(),则应用程序会按预期运行,并且我会看到内存的锯齿模式被释放。
我的问题是 - 为什么应用程序使用的大量内存不会自动触发 GC?在包含终结器的示例中,GC 会在第一次之后再次运行吗?
oop - 如何强制定义析构函数
我想强制继承类在 Fortran >= 2008 中定义析构函数。
到目前为止,我已经尝试了以下几种变体:
甚至不编译。我如何实现这个目标?
java - 在其他对象之前防止对象垃圾收集
我有一个对其他对象的弱引用的弱引用数组,如下所示:
由于我现在不会讨论的原因,数组本身被弱引用。我想确保在任何 Bar 对象可以从它到达之前它不会被垃圾收集。换句话说,只要存在可以从中访问的任何 Bar 对象,它就必须存在于内存中。然后,如果不再存在 Bar 对象,那么最好对数组进行垃圾回收。(Bar 对象可能会或可能不会从其他地方强烈访问。)我通过引用所有 Bar 对象内的字段中的缓存数组来做到这一点。如果该字段足以使数组强可达,则不会被垃圾回收。但是,我的代码从未真正使用过该字段,我无法将其公开。(我收到“未使用”警告。)我担心此类字段的存在在编译时或运行时终止,
这是正确的解决方案吗?无论垃圾收集器或 JVM 实现如何,此解决方案都能实现我想要的吗?如果没有,有什么更好的方法?
c# - IDisposable, using 和 GarbageColleciton
我陷入了如何IDisposable
和GarbageCollector
工作的杂草中。
假设您有一个IDisposable
对象,它实际上并没有它所持有的资源(但该Dispose()
方法在调用时会做一些事情)。并假设您在块的头部声明它using
,但实际上并没有在块的过程中与对象交互。
我对GarbageCollection
将如何运作有什么保证?
IE
注意:
- MyConceptuallyDisposableObject 没有声明终结器/析构函数。
- (假设开发人员永远不会忘记
using
`.Dispose()` 我的对象)
- (假设开发人员永远不会忘记
- MyConceptuallyDisposableObject 不会
GC.SuppressFinalise(this)
在任何地方调用。
我是否保证object
我构建的将:
- 以前不会
.Dispose()
叫过吧PointX
? - 究竟会不会叫它
.Dispose()
呢?PointX
- 之前的任何时候都不会得到GarbageCollected/Finalized吗?
PointX
- 在它调用它之前不会得到GarbageCollected/Finalized吗?
.Dispose()
假设我然后更改我的代码以在其构造函数中进行MyConceptuallyDisposableObject
调用。GC.SuppressFinalise(this)
(请记住,没有任何析构函数或终结器)
- 这会改变上述具体问题的任何答案吗?
- 那么一般情况有什么变化吗?
- 这是否意味着
GC
永远不会清理我的对象并且我最终会出现内存泄漏?
*语境:*
为那些不可避免地好奇的人发布,但请不要回答基于建议其他方法来实现这一点或我不应该这样做。现在,我更专注于从抽象意义上理解上述概念的内涵,而不是讨论我最初的尝试是否明智。
我想写一个DisposableAction()
接受 2 Action
s 的类。一种在您构建时执行,另一种在您构建时执行Dispose()
。
我以为我知道上述所有问题的答案(并且它们是“是”、“是”、“是”、“是”、“否”、“几乎没有,除非你对性能非常敏感”和“不”。),但我一直在尝试诊断一个似乎与这些信念相矛盾的错误。
c++ - C++ 自动终结或对象销毁
在这个例子中,我遇到了复制代码的问题:
Bnd 这里是一个糟糕的代码结构。如果我有很多构造,代码的宽度会太大,这也很糟糕:
如何保存好的代码结构并解决代码复制?Finalize1/2/3 是一个 API 函数,而不是我的程序类。也许一些 STL 容器可以解决它?也许是这样的?