首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >垃圾收集使FileDescriptor无效?

垃圾收集使FileDescriptor无效?
EN

Stack Overflow用户
提问于 2015-06-16 23:16:59
回答 1查看 375关注 0票数 0

我正在使用安卓上的FileDescriptor打开一个资产。垃圾收集似乎将FileDescriptor的内部描述符更改为-1。试图在此之后使用FileDescriptor引发异常。

作为正常检查,我将此代码添加到一个空白项目中:

代码语言:javascript
复制
    try{
        fd = getAssets().openFd("greensleeves.wav").getFileDescriptor();
    }catch(IOException e) {
    }

    System.out.println("file descriptor before gc" + fd);
    try { Thread.sleep(100); } catch (InterruptedException e) {}
    System.out.println("file descriptor before gc" + fd);
    try { Thread.sleep(100); } catch (InterruptedException e) {}
    System.out.println("file descriptor before gc" + fd);
    System.gc();
    System.out.println("file descriptor after gc" + fd);
    System.out.println("file descriptor after gc" + fd);
    System.out.println("file descriptor after gc" + fd);

这是输出

代码语言:javascript
复制
      System.out  I  file descriptor before gcFileDescriptor[45]
      System.out  I  file descriptor before gcFileDescriptor[45]
      System.out  I  file descriptor before gcFileDescriptor[45]
        dalvikvm  D  GC_EXPLICIT freed 176K, 3% free 9108K/9316K, paused 2ms+2ms, total 24ms
      System.out  I  file descriptor after gcFileDescriptor[-1]
      System.out  I  file descriptor after gcFileDescriptor[-1]
      System.out  I  file descriptor after gcFileDescriptor[-1]

这一切为什么要发生?我如何安全地使用FileDescriptor而不必担心与垃圾收集器竞争?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-06-16 23:31:17

您不会保留对由AssetFileDescriptor创建的openFd()的引用。当它得到GC‘’ed时,它有一个内部ParcelFileDescriptor,最终也是GC‘’ed。这反过来又具有对您在调用FileDescriptor时检索的getFileDescriptor()的引用。它还碰巧有一个finalize()方法,当调用该方法时,它将关闭文件描述符(通过调用IoUtils.closeQuietly(mFd);)。收集finalize()时,GC将调用此ParcelFileDescriptor方法。你所观察到的行为就是这样发生的。

我的猜测,为什么睡眠不会触发这些事件,是没有压力的GC清理东西。

要测试这一点(如果我是对的,以防止无效),请在实验期间维护对openFd()返回的对象的引用。

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

https://stackoverflow.com/questions/30879831

复制
相关文章

相似问题

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