相关疑难解决方法(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
查看次数

垃圾收集 - 为什么c3在此示例中不符合收集条件(SCJP 6)

摘自SCJP 6准备书 -

鉴于:

class CardBoard {
    Short story = 200;
    CardBoard go(CardBoard cb) {
        cb = null;
        return cb;
    }
    public static void main(String[] args) {
        CardBoard c1 = new CardBoard();
        CardBoard c2 = new CardBoard();
        CardBoard c3 = c1.go(c2);
        c1 = null;
        // do Stuff
    }
}
Run Code Online (Sandbox Code Playgroud)

当达到// doStuff时,有多少对象符合GC条件?

A. 0

B. 1

C. 2

D.编译失败

E.无法知道

F.运行时抛出异常

正确答案是C - "只有一个CardBoard对象(c1)符合条件,但它有一个相关的Short包装器对象,也符合条件."

我的问题是为什么c3不符合收藏资格?

我的想法是 -

c1.go(c2)将本地引用变量cb(它是c2的副本)设置为null,然后返回分配给c3的cb.我知道c2本身的引用变量不能在方法中修改,只能修改它背后的对象.但是在我看来,引用变量cb的副本被设置为null并分配给c3.为什么在此实例中c3未设置为返回的null?

java garbage-collection scjp pass-by-value

3
推荐指数
1
解决办法
2060
查看次数