相关疑难解决方法(0)

finalize()在Java 8中调用强可达对象

我们最近将我们的消息处理应用程序从Java 7升级到Java 8.自升级以来,我们偶尔会遇到一个流在读取时被关闭的异常.记录显示终结器线程正在调用finalize()保存流的对象(进而关闭流).

代码的基本概要如下:

MIMEWriter writer = new MIMEWriter( out );
in = new InflaterInputStream( databaseBlobInputStream );
MIMEBodyPart attachmentPart = new MIMEBodyPart( in );
writer.writePart( attachmentPart );
Run Code Online (Sandbox Code Playgroud)

MIMEWriter并且MIMEBodyPart是本土MIME/HTTP库的一部分. MIMEBodyPart扩展HTTPMessage,具有以下内容:

public void close() throws IOException
{
    if ( m_stream != null )
    {
        m_stream.close();
    }
}

protected void finalize()
{
    try
    {
        close();
    }
    catch ( final Exception ignored ) { }
}
Run Code Online (Sandbox Code Playgroud)

异常发生在调用链中MIMEWriter.writePart,如下所示:

  1. MIMEWriter.writePart() 写入部件的标题,然后调用 part.writeBodyPartContent( this )
  2. MIMEBodyPart.writeBodyPartContent()调用我们的实用工具方法 …

java garbage-collection finalize finalizer java-8

22
推荐指数
1
解决办法
2182
查看次数

当java仍然在范围内时,java能否最终确定它?

我一直在研究我的代码中的一个错误,这个错误似乎是由一些"丑陋的"终结器代码引起的.代码看起来大致如此

public class A {
   public B b = new B();
   @Override public void finalize() {
     b.close();
   }
}

public class B {
   public void close() { /* do clean up our resources. */ }
   public void doSomething() { /* do something that requires us not to be closed */ } 
}

void main() {
   A a = new A();
   B b = a.b;
   for(/*lots of time*/) {
     b.doSomething();
   }
}
Run Code Online (Sandbox Code Playgroud)

我认为正在发生的事情是,a在第二行之后检测到没有引用main()并获得GC并最终确定终结器线程 - 当for循环仍然发生时,使用 …

java garbage-collection

21
推荐指数
2
解决办法
1389
查看次数

标签 统计

garbage-collection ×2

java ×2

finalize ×1

finalizer ×1

java-8 ×1