jjzjj

Finalize

全部标签

java - 你在子类中调用 super.finalize() 吗?

我(在某处)读到,当子类被垃圾回收时,不能保证调用父类的finalize(),这是否意味着大多数开发人员会覆盖finalize()在子类中调用super.finalize()? 最佳答案 Finalize不会自动为父类(superclass)调用。因此,如果您重写finalize,确保父类(superclass)得到清理的正确方法是protectedvoidfinalize(){try{//dosubclasscleanup}finally{super.finalize();}}请参阅这篇引用文章http://www.ibm.com

java - 虚引用对象

PhantomReferences用于事后分析操作。Java规范规定,在清除幻象引用本身之前,不会释放幻象引用对象。我的问题是:此功能(对象未解除分配)有什么作用?(我想到的唯一想法是允许native代码对对象进行事后清理,但这并没有多大说服力)。 最佳答案 编辑,因为我首先误解了这个问题:引自此处http://www.memorymanagement.org/glossary/p.html:TheJavaspecificationsaysthatthephantomreferenceisnotclearedwhentherefer

java - 终结器(和 ReferenceQueue 的)是否在 JVM 终止时运行?

这个问题在这里已经有了答案:DoesJVM/GCcall`finalize()`onprogram/threadexit?(2个答案)关闭9年前。我知道youcan'tcountonfinalizers清理你的烂摊子(即免费资源),但我想知道-当JVM正常终止(System.exit()/没有剩余线程)时,java对象是否得到GC'ed/finalized?/p>编辑:因此,不能保证触发GC,因此finalize()也不能保证,但是ReferenceQueue会起作用吗?

java - 你能指望 .finalize() 被调用吗?

我试图检测我的一些Java代码以确保对象被正确地垃圾收集,但我惊讶地发现它并没有像我预期的那样频繁地被调用。我现在想知道这是因为检测错误还是我需要解决的实际内存泄漏。VisualVM分析器似乎表明是前者。问题是我有一个处理请求的线程,并且在请求中创建了数千个临时对象。有时,这个线程写入的套接字意外关闭,线程遇到异常而死。当Thread结束时,似乎不会对这些对象调用.finalize()。这是不信任我的仪器的原因吗? 最佳答案 Finalize()不是解决方案。如果有的话,你不知道什么时候会调用终结器。如果您的问题是异常,请使用try

Java:错误定义的 finalize 方法会造成内存泄漏

在Java中,如果没有指向x的强引用并且x符合垃圾回收条件,垃圾回收将调用对象x的finalize方法。如果finalize方法永远不会终止,这会导致内存泄漏吗?publicclassX{protectedvoidfinalize(){while(true){}}} 最佳答案 是的,很容易测试publicclassX{protectedvoidfinalize(){while(true){}}publicstaticvoidmain(String[]args)throwsException{while(true){newX();}}

java - 为什么 Java 中的一些资源没有被垃圾回收,必须关闭或自动关闭?

如果幸运的话,其中一些类会实现AutoClosable但有时你只需要小心并检查现有的方法,就会注意到有一个close、destroy或shutdown方法(或任何其他方法)作者决定给它命名)。这是Java中资源泄漏的主要来源。我和一位同事讨论过这个问题,我也想知道:为什么这不能以某种方式自动化?理论上你可以对这种情况使用finalize,但它是notrecommended.那么为什么没有办法只使用其中一些可关闭的资源并让GC在实例不再可用时自动关闭它们而不必记住明确编写一些close处理代码(如try...)?这是因为在GC启动之前系统可能资源匮乏(文件描述符,...)?注意:我尽可能

java - 为什么在重写 finalize 方法时引用不放入引用队列

publicclassTest{publicstaticvoidmain(String[]args)throwsException{AaObject=newA();ReferenceQueuequeue=newReferenceQueue();PhantomReferenceweak=newPhantomReference(aObject,queue);aObject=null;System.gc();TimeUnit.SECONDS.sleep(1);System.out.println(queue.poll());}}classA{@Overrideprotectedvoidfin

java - 可终结对象的前期成本是多少?

Java中可终结对象的讨论通常会讨论当可终结对象(及其相关资源)无法快速被垃圾回收时发生的常见间接成本。目前,我更感兴趣的是,在内存方面和对象分配时间方面,最终化的实际直接成本是多少。我在很多地方看到过对这种成本存在的间接引用,例如Oracle'sarticleonfinalizationmemoryretentionissues备注:Whenobjisallocated,theJVMinternallyrecordsthatobjisfinalizable.ThistypicallyslowsdowntheotherwisefastallocationpaththatmodernJV

java - 清理 finalize() 或 finally() 中的代码?

我一般认为资源清理是在finallyblock中完成的,最近我在一个类中发现了这个特定的代码片段,它覆盖了Object类'finalize()方法。protectedvoidfinalize(){try{In.close();Out.close();socket.close();}catch(Exceptione){//loggercodehere}}这是个好主意吗?finalize()相对于finally的优缺点是什么? 最佳答案 finallyblock只是一个始终在tryblock之后执行的代码块,即使出现异常也是如此。即它在

java - 在 Java9 中,终结器已被弃用,取而代之的是引入了清理器。两者有什么区别?

关闭。这个问题需要更多focused.它目前不接受答案。想改进这个问题吗?更新问题,使其只关注一个问题editingthispost.关闭4年前。Improvethisquestion在Java9中,终结器已被弃用,并引入了清洁器的新概念。具体原因是什么?是否有任何特定的场景或原因应该优先使用清洁器而不是终结器(假设不推荐使用它们)。?