问题标签 [finalizer]

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 回答
8276 浏览

c# - 如何对终结器进行单元测试?

我有以下类,它是IDisposable对象的装饰器(我省略了它添加的东西),它本身IDisposable使用通用模式实现:

我可以很容易地测试被调用innerDisposable时处理的内容:Dispose()

但是我如何编写测试以确保innerDisposable不会终结器处理?我想写这样的东西,但它失败了,大概是因为 GC 线程没有调用终结器:

0 投票
4 回答
1252 浏览

java - 终结器对 JVM 的性能影响

根据这篇文章,在.Net中,

终结者实际上比这更糟糕。除了它们运行迟缓(这对于许多资源来说确实是一个严重的问题)之外,它们也没有那么强大,因为它们只能执行析构函数中允许的操作的子集(例如,终结器不能可靠地使用其他对象,而析构函数可以),即使在那个子集中编写终结器也很难正确编写。并且收集可终结的对象是昂贵的:每个可终结的对象,以及从它可以到达的潜在的巨大对象图,都被提升到下一代 GC,这使得收集一些大倍数的代价更高。

这是否也适用于一般的 JVM,特别是 HotSpot?

0 投票
2 回答
280 浏览

.net - MySQL 在 Finalize 中抛出 NullReferenceException... 你是如何处理这个问题的?

我在 64 位 Windows 上使用带有 .Net 连接器的 MySQL。出于某种原因,Mysql 在 Finalize 中抛出了 NullReferenceException。这是这里的问题,似乎是由于这里描述的错误。这个错误是在 6.22 中报告的,但我也遇到了 6.23 的问题,所以显然它没有修复。

我将 MySQL 与辅助类一起使用,并通过实例化连接和 Mysqlcommand 对象。

有人知道我需要更改代码的哪一部分来解决此问题吗?因为即使这是 Mysql 中的一个错误,这也不是通用的,因为我在其他项目中没有遇到问题。MySQL 错误报告也没有关于如何重现它的详细信息。

有什么建议么?

0 投票
3 回答
3010 浏览

java - 如果在 finalize() 期间抛出异常会发生什么

如果在 finalize() 执行过程中抛出异常会发生什么?堆栈是否正常展开?它是否继续 finalize() 并忽略异常?它会停止 finalize() 并继续 GC 对象吗?或者是其他东西?

我不是在寻找使用 finalize() 的指南,有很多页面解释了这一点。

0 投票
4 回答
6274 浏览

java - java:wait()、notify() 和同步块

我了解到调用对象的wait()方法将释放对象监视器(如果存在)。

notify()但是我对另一个线程调用这个对象有一些疑问:

  1. (何时)等待线程会唤醒,如果另一个(第三个)线程同时拥有对象监视器?

  2. wait()如果在该对象上调用第三个线程,等待线程会唤醒吗?

  3. 是否可以确定线程是否正在等待通知特定对象(java 1.4/java 5)

  4. 如果wait()将在finalize()方法中调用会发生什么?

0 投票
1 回答
284 浏览

java - JRubyClassLoader 没有被释放

我们在 Tomcat 6.0.28 下运行一个小型 JRuby on Rails 应用程序,并带有基于 Spring 的后端。我花了一些时间使用 Eclipse 内存分析工具,我可以肯定地说,这些实例JRubyClassLoader正在泄漏。我将我们的 web 应用程序设置为仅使用一个 JRuby 运行时,然后通过touching战争有效地对 Tomcat 进行了热部署。这样做几次之后,我可以看到几个JRubyClassLoader坐在周围的实例。

由于类加载器没有被释放,它加载的类没有被释放,我们的 PermGen 空间已经用完了。

使用 Eclipse 内存分析,我可以看到 GC 根的路径如下所示:

而且清单next java.lang.ref.Finalizer似乎永远在继续……指出我似乎无法找到实际的 GC 根。

如果运行泄漏嫌疑人报告,#1 嫌疑人是“java.lang.ref.Finalizer”,由“<system class loader>”加载。

任何想法为什么终结器仍然存在?

编辑

作为一个可能相关的旁注,每次我进行热部署时,都会获得大量NullPointerExceptions

编辑 2

我升级到 JRuby 1.5.1,我仍然看到同样的问题。

0 投票
4 回答
726 浏览

c# - 终结器访问托管内容

我很清楚终结器通常用于控制非托管资源。在什么情况下终结器可以处理托管的?

我的理解是,终结器队列中的存在将阻止任何对象或由此强烈引用的对象被收集,但它(当然)不会保护它们免于终结。在正常的事件过程中,一旦对象完成,它将从队列中删除,并且它引用的任何对象将不再受到保护,不会在下一次 GC 传递时被收集。在调用终结器时,可能已经为对象引用的任何对象组合调用了终结器;不能依赖以任何特定顺序调用终结器,但持有的对象引用应该仍然有效。

很明显,终结器绝不能获取锁,也不能尝试创建新对象。但是,假设我有一个订阅某些事件的对象,以及另一个实际使用这些事件的对象。如果后一个对象有资格进行垃圾回收,我希望前一个对象尽快取消订阅事件。请注意,在没有任何活动对象持有它的订阅之前,前一个对象永远不会有资格完成。

是否有一个无锁链表堆栈或需要取消订阅的对象队列,并让主对象的终结器引用堆栈/队列上的另一个对象?必须在创建主对象时分配链表项对象(因为禁止在终结器中分配),并且可能需要使用诸如计时器事件之类的东西来轮询队列(因为事件取消订阅将不得不在终结器线程之外运行,并且拥有一个唯一目的是等待终结器队列中出现的线程可能是愚蠢的),但是如果终结器可以安全地引用其预分配的链表对象以及与其类关联的主队列对象,

这是个好主意吗?(注意:我使用的是 .net 2.0;此外,尝试添加到堆栈或队列可能会在 Threading.Interlocked.CompareExchange 上旋转几次,但我不希望它会被卡住很长时间)。

编辑

当然,任何订阅事件的代码都应该实现 iDisposable,但一次性的东西并不总是被正确处理。如果有,就不需要终结器了。

我关心的场景类似于以下内容:实现 iEnumerator(of T) 的类挂钩到其关联类的 changeNotify 事件,以便在底层类发生更改时可以明智地处理枚举(是的,我知道微软认为所有枚举数应该简单地放弃,但有时可以继续工作的枚举器会更有用)。在几天或几周的过程中,一个类的实例很可能被枚举了数千甚至数百万次,但在此期间根本没有更新。

理想情况下,枚举器在不被释放的情况下永远不会被遗忘,但枚举器有时用于“foreach”和“using”不适用的上下文中(例如,一些枚举器支持嵌套枚举)。精心设计的终结器可能会提供处理这种情况的方法。

顺便说一句,我要求任何应该通过更新继续的枚举必须使用通用的 IEnumerable(of T); 如果集合被修改,不处理 iDisposable 的非泛型表单将不得不抛出异常。

0 投票
2 回答
326 浏览

apache-flex - Adobe Flex 3 中的终结者

使用 Adob​​e Flex 3,有没有办法指定终结器?

0 投票
1 回答
467 浏览

java - Java GC 问题:当一个对象的方法之一仍在执行时,它怎么会变得不可访问?

我一直在阅读这些关于 Java 终结器的幻灯片。在其中,作者描述了一个场景(在幻灯片 33 上),该场景CleanResource.finalize()可以由终结器线程运行,同时CleanResource.doSomething()仍在另一个线程上运行。这怎么可能发生?

如果doSomething()是一个非静态方法,那么要执行该方法的某个人,某处必须对它有一个强引用......对吗?那么如何在方法返回之前清除这个引用呢?另一个线程可以突入并取消该引用吗?如果发生这种情况,是否doSomething()仍会在原始线程上正常返回?

这就是我真正想知道的,但是对于一个真正超越的答案,你可以告诉我为什么doSomething()幻灯片 38 上的比doSomething()幻灯片 29 上的更好。为什么简单地调用这个方法就足够了keepAlive()?您不需要将整个调用包装myImpl.doSomething()在一个synchronized(this){}块中吗?

0 投票
3 回答
989 浏览

java - 完成块的问题

我正在阅读 Joshua Bloch 的“Effective Java programming”。在这本书中,他建议不要使用“finalize”块,因为它不能保证被执行。任何人都可以对此进行更多解释或提供一些文章的链接来解释这一点详细地?