首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java等价于GC.SuppressFinalize

Java等价于GC.SuppressFinalize
EN

Stack Overflow用户
提问于 2014-05-22 04:40:25
回答 2查看 913关注 0票数 1

Java是否与.NET的GC.SuppressFinalize相当

在.Net中,只要显式地释放对象,SuppressFinalize就会在处置模式中使用,以避免终结的相对较高的性能成本。类似的成本也适用于Java,但它似乎没有SuppressFinalize。

我知道,通常情况下最好完全避免终结器,但我不认为我能够为特定的用例避免它们(一个cancel令牌,您可以添加处理程序,只有当另一个令牌未被取消时才能运行,因此由于收集源而变得不朽的令牌必须导致从链接令牌中删除条目,以免它们在没有绑定的情况下积累垃圾条目)。

在Java中是否有类似于SuppressFinalize的内容?如果没有,可以使用可用的工具(例如ReferenceQueue)来近似吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-05-22 05:06:53

Java没有原生的"GC.SuppressFinalize“方法。但是IDiposable模式将对您解决这一问题非常有用。

当您知道某项不再需要时,您可以手动处理它,或者能够运行清理代码来安全地关闭连接、关闭文件、etc.Also您将能够使用终结器捕捉不知道何时应该清除对象的情况。

票数 0
EN

Stack Overflow用户

发布于 2015-02-27 23:04:52

我想出了一个可能的解决办法,因为Java中没有类似的方法,只要避免终结器的成本:使用缓存。

  1. 有一个具有可变回调成员的对象: 公共最终类终结器{公共可运行的onFinalizer;@重写受保护的void (){ if (onFinalizer != null) { onFinalizer.run();}
  2. 收集它们: 堆栈finalizerCache =新的Stack<>();
  3. 需要时抓住: this.finalizer = finalizerCache.isEmpty()?新终结器():finalizerCache.pop();this.finalizer.onFinalizer =() -> {我的特殊清理代码;};
  4. 在需要时丢弃: 无效取消(){ this.finalizer.onFinalizer =空;if (finalizerCache.size() < 100) { finalizerCache.push( this.finalizer );}this.finalizer=空;}

显然,与缓存的大小和同步方式有关的调整可能很多,但这应该是一种有效的方法,可以避免在终结器很少运行且需要完成的对象总数不太多的情况下,终结器的成本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23797944

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档