【问题标题】:In Jelly Bean (Android 4.1) have error occured -> open failed: EMFILE (Too many open files)在 Jelly Bean (Android 4.1) 中发生错误 -> 打开失败:EMFILE (打开的文件太多)
【发布时间】:2014-01-16 00:14:54
【问题描述】:

我正在开发一个下载应用程序并同时运行多个线程以快速下载。但是我遇到了 android 4.1 jelly bean 的问题,它产生了打开的文件太多(打开失败:EMFILE(打开的文件太多))的异常。据我所知,一个进程只能打开 1024 个文件。但问题只发生在果冻豆而不是 ICS。

有没有人可以帮助解决这些问题。由于文件很多,所以在 10 多个线程中下载文件很重要。

请提出任何想法。以编程方式解决。

【问题讨论】:

  • illegalargumentexception.blogspot.de/2008/10/… 是关于关闭OutputStreams 的可靠方法的好资源。您的问题可能与未关闭事物有关
  • 您能找到解决方案吗?我在 Jellybean 上遇到了同样的问题。实际上适用于所有版本的 Jellybean(4.1 到 4.3)。 Gingerbread、ICS 和 Kitkat 中不存在该问题。

标签: java android linux


【解决方案1】:

Linux 操作系统上每个进程打开文件的数量有一个硬性限制。如果您具有系统级访问权限,则该数字是可配置的,但不能通过 Android。除了编写您的应用程序之外别无他法,这样一次打开的文件就更少了。

虽然实际上,如果您遇到此问题,您可能会在某处泄漏文件句柄。确保关闭所有打开的文件——限制是同时打开的文件,如果你关闭一个文件,你总是可以打开一个新文件来代替它。

【讨论】:

    【解决方案2】:

    几周前我只在 Jellybean 中遇到了同样的问题,终于找到了解决方法。见https://stackoverflow.com/a/20417556/976367

    【讨论】:

      【解决方案3】:

      也许 httpClient“有更多错误”并且已被弃用,但 JellyBean 的这个问题是一个大问题。我正在使用 Ksoap2,所以我尝试了所有建议的答案。

      • System.setProperty("http.keepAlive", "false");
      • httpTransportSE.getServiceConnection().setRequestProperty("Connection", "close");
      • httpTransportSE.getServiceConnection().disconnect();

      没有任何效果 - 我的解决方案是将我正在使用的 Ksoap2 版本从 3.1.1 回滚到 2.6.5。使用 2.6.5 大大减少了问题。仍在测试,但可能已经解决。

      可能是旧版本的 KSoap2 对我有用的原因是它使用的是 httpClient 而不是 httpUrlConnection。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-16
        • 1970-01-01
        相关资源
        最近更新 更多