我需要知道何时finalize()调用该方法JVM.我创建了一个测试类,当finalize()通过覆盖它来调用方法时,该测试类会写入文件.它没有被执行.谁能告诉我它没有执行的原因?
在类中的析构函数和Finalize方法之间有什么区别?
我最近发现Visual Studio 2008认为析构函数与Finalize方法同义,这意味着Visual Studio不会让您同时在类中定义这两个方法.
例如,以下代码片段:
class TestFinalize
{
~TestFinalize()
{
Finalize();
}
public bool Finalize()
{
return true;
}
}
Run Code Online (Sandbox Code Playgroud)
在析构函数中调用Finalize时出现以下错误:
以下方法或属性之间的调用不明确:'TestFinalize .~TestFinalize()'和'TestFinalize.Finalize()'
如果对Finalize的调用被注释掉,则会出现以下错误:
类型'ManagementConcepts.Service.TestFinalize'已经定义了一个名为'Finalize'的成员,它具有相同的参数类型
在Java中,目的是什么做的关键字final,finally并finalize履行?
我正在研究垃圾收集器如何在c#中工作.我在使用的混乱Destructor,Dispose和Finalize方法.
根据我的研究和理解,在我的类中使用Destructor方法将告诉垃圾收集器以析构函数方法中提到的方式执行垃圾收集,该方法无法在类的实例上显式调用.
该Dispose方法旨在为用户提供控制垃圾收集.该Finalize方法释放类使用的资源,但不释放对象本身.
我不确定我是否理解正确的方法.请澄清疑虑.欢迎任何进一步的链接或指南.
我不得不问这个很傻.我有一个应用程序,我希望派人测试他们的机器,但我不知道如何让Xcode生成一个.app文件供我发送给他们.救命?
在Noda Time,我们使用Sandcastle和SHFB生成我们的文档.然后,我们将文档提交回源存储库 - 主要是因为这样可以轻松查看最新(和历史)文档.
我是该项目的主要开发人员,但我使用了两台计算机 - 不幸的是,他们正在构建不同的文档,即使它们都更新到同一个源.
这两台电脑在我能想到的每一个重要方面都是一样的:
为确保清洁构建而采取的步骤:
C:\Users\Jon\AppData\Local\EWSoftware\Sandcastle Help File Builder\Cache)差异仍然存在.它们似乎仅限于从MSDN本身继承的文档Object.Finalize.
版本1(在机器"Chubby"上生成):
<div class="summary">Allows an object to try to free resources and perform
other cleanup operations before it is reclaimed by garbage collection.</div>
Run Code Online (Sandbox Code Playgroud)
版本2(在机器"桑迪"上生成):
<div class="summary">Allows an <a
href="http://msdn2.microsoft.com/en-us/library/e5kfa45b" target="_blank">
Object</a> to attempt to free resources and perform other cleanup operations
before the <a href="http://msdn2.microsoft.com/en-us/library/e5kfa45b"
target="_blank">Object</a> is reclaimed …Run Code Online (Sandbox Code Playgroud) 我在接受以下选项的采访中遇到了这个问题:
如何在java中销毁对象?
a. System.gc();
b. Runtime.getRuntime.gc();
c. object.delete();
d. object.finalize();
e. Java performs gc by itself, no need to do it manually.
Run Code Online (Sandbox Code Playgroud)
答案应该是e?
如果e不存在怎么办?然后 ?显然c不是答案.a和b将为整个应用程序执行gc(问题需要一个对象).我认为这是因为在gc之前调用finalize()(但是在调用gc的最终化之后是否有必要?)或者我错了?我必须在那里回答这个问题吗?
出于好奇,
为什么finalize()方法的访问修饰符是作为protected.为什么不能呢public?有人可以解释我背后的具体原因吗?
此外,我开始知道该finalize()方法只被调用一次.如果我在程序内部调用它两次,会发生什么?垃圾收集器会再次调用它吗?
private void dummyCall() {
try {
finalize();
finalize();
} catch (Throwable e) {
e.printStackTrace();//NOT REACHES EXCEPTION
}
}
Run Code Online (Sandbox Code Playgroud) 我在接受采访时得到了以下短语:
调用Object的finalize()方法是在收集对象之前发生的最后一件事.
我不得不回答:
我选择了,True但这是错的.你能解释一下为什么吗?
我正在创作一个java库.一些旨在由库用户使用的类保存本机系统资源(通过JNI).我想确保用户"处置"这些对象,因为它们很重,并且在测试套件中它们可能导致测试用例之间的泄漏(例如,我需要确保TearDown将丢弃).为此我使Java类实现了AutoCloseable,但这似乎不够,或者我没有正确使用它:
我不知道如何使用try-with-resources在测试的情况下(我使用的语句JUnit5有Mockito),在"资源"是不是短命的-这是测试夹具的一部分.
像往常一样勤奋,我尝试finalize()在那里实现和测试闭包,但事实finalize()证明甚至没有调用(Java10).这也被标记为已弃用,我确信这个想法不会受到诟病.
这是怎么做到的?要清楚,如果他们不调用close()我的对象,我希望应用程序的测试(使用我的库)失败.
编辑:添加一些代码,如果它有帮助.它并不多,但这正是我想要做的.
@SuppressWarnings("deprecation") // finalize() provided just to assert closure (deprecated starting Java 9)
@Override
protected final void finalize() throws Throwable {
if (nativeHandle_ != 0) {
// TODO finalizer is never called, how to assert that close() gets called?
throw new AssertionError("close() was not called; native object leaking");
}
}
Run Code Online (Sandbox Code Playgroud)
编辑2,赏金的结果感谢所有的回复,一半的赏金被自动授予.我的结论是,对于我的情况,最好尝试解决方案Cleaner.但是看起来,虽然已经注册,但是不会调用清理操作.我在这里问了一个跟进问题.
finalize ×10
java ×6
c# ×2
destructor ×2
dispose ×2
.net ×1
call ×1
compilation ×1
final ×1
finally ×1
methods ×1
sandcastle ×1
shfb ×1
xcode ×1