当前位置: 首页 > 知识库问答 >
问题:

Firebase DB:应用程序打开了太多文件。默认情况下,一个进程中可用文件描述符的最大值为1024

郭修平
2023-03-14

我在Firebase中遇到以下错误。我的代码不会直接打开任何文件,但它可以广泛地与HttpOK、WebRTC和整体网络配合使用。网络也使用文件描述符吗?由于错误不是由我的代码引起的,我很好奇如何修复它。我可以看看在哪里打开了哪些文件描述符吗?(然后我可以找到导致描述符泄漏的原因)。

2021-06-13 04:14:59.610 30892-30994/com.mafialab.mafiaE/SQLiteDatabase:无法打开数据库/data/user/0/com.mafialab.mafia/databases/google_app_measurement_local.db。android.database.sqlite.SQLiteCantOpenDatabase aseException:未知错误(代码2062):无法打开数据库 ################################################################# 错误代码:2062(SQLITE_CANTOPEN_EMFILE)原因:应用程序打开了太多文件。未知错误(代码2062):无法打开数据库) ################################################################# 在android.database.sqlite.SQLiteCatabase.open打开(本机方法)在atabase.java:1146SQLiteCandroid.database.sqlite.(SQLiteCatabase.open)在atabase.java:861SQLiteConnection.open(SQLiteCmpl.open)在mpl.java:729SQLiteConnectionPandroid.content.ConnectionLocked(SQLiteConnectionPool.java:649)在android.database.sqlite.SQLiteConnectionPool.open(SQLiteConnectionPool.java:222)在android.database.sqlite.SQLiteDatabase.open内(SQLiteDatabase.java:1191)在android.database.sqlite.SQLiteDonnection.native(SQLiteDandroid.database.sqlite.)在onnection.openSQLiteDonnection.java:262数据库(SQLiteDandroid.database.sqlite.)在ContextIonnection.java:205OrCreateDatabase(ContextIandroid.database.sqlite.)在ool.openContextWrapper. openOrCreateDatabase(ContextWrapper. java: 310)在android. sqlite. SQLiteOpenHelper. getDatabase aseLocked(SQLiteOpenHelper. java: 254)在SQLiteOpenHelper. getWritableDatabase(SQLiteOpenHelper. java: 194)位于com. google. android. gms. android. gms: play-services-测量-impl@@19.0.0:1)位于com. google. android. gms. gms: play-services-测量-impl@@19.0.0:1)位于com. google. android. gms: play-services-测量-impl@@19.0.0:1)位于com. google. android. gms. gms: play-services-测量-impl@@19.0.0:9FutureTask. run(FutureTask. java: 266)在com. google. android. gms. ometurement. interals. zzfq. run(com. google. android. gms: play-services-测量-impl@@19.0.0:6)2021-06-13 04:14:59.619 30892-30994/com. mafialab. mafia E/FA:打开本地数据库失败,删除并重新创建它2021-06-13 04:14:59.622 30892-30994/com. mafialab. mafia W/SQLiteLog:(28)无法打开"/data/user/0/com. mafialab. mafia/数据库/google_app_measurement_local. db",标志(131138)和mode_t(0)由于错误(24)2021-06-13 04:14:59.622 30892-30994/com. mafialab. mafia W/SQLiteLog:(28)无法打开"/data/[4bb21d8205] 2021-06-13 04:14:59.622 30892-30994/com. mafialab. mafia E/SQLiteLog:(14)os_unix. c: 36170:(24)open(/data/user/0/com. mafialab. mafia/数据库/google_app_measurement_local. db)

  • 2021 06月13日04:14:59.622 30892-30994/com。mafialab。mafia E/SQLiteLog:(1)过程:Pid(30892)Uid(10190)Euid(10190)Gid(10190)Egid(10190)2021-06-13 04:14:59.624 30892-30994/com。mafialab。mafia E/SQLiteDatabase:无法打开数据库“/data/user/0/com”。mafialab。mafia/databases/google\u app\u measurement\u local。db’。Android数据库sqlite。SqliteContoppenDatabaseException:未知错误(代码2062):无法打开数据库##############################错误代码:2062(SQLITE_CANTOPEN_EMFILE)原因:应用程序打开了太多文件。默认情况下,一个进程中可用文件描述符的最大值为1024。(未知错误(代码2062):无法打开数据库)##############################在android上。数据库sqlite。SQLITE连接。android上的nativeOpen(本机方法)。数据库sqlite。SQLITE连接。在android上打开(SQLiteConnection.java:262)。数据库sqlite。SQLITE连接。在android上打开(SQLiteConnection.java:205)。数据库sqlite。SQLiteConnectionPool。android上的openConnectionLocked(SQLiteConnectionPool.java:649)。数据库sqlite。SQLiteConnectionPool。在android上打开(SQLiteConnectionPool.java:255)。数据库sqlite。SQLiteConnectionPool。在android上打开(SQLiteConnectionPool.java:222)。数据库sqlite。SQLITE数据库。android上的openInner(SQLiteDatabase.java:1191)。数据库sqlite。SQLITE数据库。在android上打开(SQLiteDatabase.java:1146)。数据库sqlite。SQLITE数据库。android上的openDatabase(SQLiteDatabase.java:861)。应用程序。ContextImpl。android上的openOrCreateDatabase(ContextImpl.java:729)。所容纳之物ContextWrapper。android上的openOrCreateDatabase(ContextWrapper.java:310)。数据库sqlite。SQLiteOpenHelper。android上的getDatabaseLocked(SQLiteOpenHelper.java:254)。数据库sqlite。SQLiteOpenHelper。getWritableDatabase(SQLiteOpenHelper.java:194)位于com.google.Androidgms。测量内部的zzef。getWritableDatabase(com.google.android.gms:play services measurement impl@19.0.0:9)位于com.google.Androidgms。测量内部的zzeg。zzo(com.google.android.gms:play services measurement impl@19.0.0:1)在com上。谷歌。Androidgms。测量内部的zzeg。zzq(com.google.android.gms:play services measurement impl@19.0.0:6)位于com.google.Androidgms。测量内部的zzeg。zzi(com.google.android.gms:play services measurement impl@19.0.0:9)位于com.google.Androidgms。测量内部的zzjk。zzl(com.google.android.gms:play services measurement impl@19.0.0:6)在com上。谷歌。Androidgms。测量内部的zzhw。zzu(com.google.android.gms:play services measurement impl@19.0.0:147)位于com.google.Androidgms。测量内部的zzhc。在java上运行(com.google.android.gms:play services measurement impl@19.0.0:1)。util。同时发生的遗嘱执行人$RunnableAdapter。在java上调用(Executors.java:457)。util。同时发生的未来任务。在com上运行(FutureTask.java:266)。谷歌。Androidgms。测量内部的zzfq。运行(com.google.android.gms:play services measurement impl@19.0.0:6)2021 06月13日04:14:59.625 30892-30994/com。mafialab。mafia E/FA:无法打开本地数据库。事件将绕过本地存储:android。数据库sqlite。SqliteContoppenDatabaseException:未知错误(代码2062):无法打开数据库##############################错误代码:2062(SQLITE_CANTOPEN_EMFILE)原因:应用程序打开了太多文件。默认情况下,一个进程中可用文件描述符的最大值为1024。(未知错误(代码2062):无法打开数据库)#######################################:com.google.Androidgms。测量内部的zzef。getWritableDatabase(com.google.android.gms:play services measurement impl@19.0.0:9)

共有1个答案

哈翔
2023-03-14

套接字(网络或管道)确实有文件描述符。

您可以列出它们:

for (f in File("/proc/self/fd").listFiles()) {
    Log.i(TAG, "file : ${f.isFile}, ${f} -> ${f.canonicalPath}")
}
...
file : false, /proc/self/fd/50 -> /dev/kgsl-3d0
file : false, /proc/self/fd/51 -> /proc/2815/fd/51
file : false, /proc/self/fd/52 -> /proc/2815/fd/52
file : false, /proc/self/fd/53 -> /proc/2815/fd/53
file : false, /proc/self/fd/54 -> /proc/2815/fd/54
file : false, /proc/self/fd/55 -> /proc/2815/fd/55
file : false, /proc/self/fd/56 -> /proc/2815/fd/56
file : false, /proc/self/fd/57 -> /dev/ion
file : false, /proc/self/fd/58 -> /dev/ion
file : false, /proc/self/fd/59 -> /dev/hwbinder
file : true, /proc/self/fd/63 -> /data/app/com.google.android.gms-xErOVYdgUuUxSUGYRGwZ0A==/split_config.en.apk
file : true, /proc/self/fd/64 -> /data/app/com.google.android.gms-xErOVYdgUuUxSUGYRGwZ0A==/split_config.xxhdpi.apk

在Android 8.0(API级别26)上,可以获得更多细节:

for (f in File("/proc/self/fd").listFiles()) {
    try {
        Log.i(TAG, "file : ${f.isFile}, ${f} -> ${java.nio.file.Files.readSymbolicLink(f.toPath())}")
    } catch (ex: Exception) {
        Log.w(TAG, "Failed to get info for $f")
    }
}
...
file : false, /proc/self/fd/50 -> /dev/kgsl-3d0
file : false, /proc/self/fd/51 -> socket:[3647176]
file : false, /proc/self/fd/52 -> socket:[3648033]
file : false, /proc/self/fd/53 -> anon_inode:[eventfd]
file : false, /proc/self/fd/54 -> socket:[3648028]
file : false, /proc/self/fd/55 -> socket:[3648030]
file : false, /proc/self/fd/56 -> anon_inode:[eventpoll]
file : false, /proc/self/fd/57 -> /dev/ion
file : false, /proc/self/fd/58 -> /dev/ion
file : false, /proc/self/fd/59 -> /dev/hwbinder
file : true, /proc/self/fd/63 -> /data/app/com.google.android.gms-xErOVYdgUuUxSUGYRGwZ0A==/split_config.en.apk
file : true, /proc/self/fd/64 -> /data/app/com.google.android.gms-xErOVYdgUuUxSUGYRGwZ0A==/split_config.xxhdpi.apk
 类似资料:
  • 问题内容: 我的程序成功创建并填充了Excel(.xls)文件。创建完成后,我希望在系统的默认程序(以Excel为例)中打开新文件。我该如何实现? 对于我想在记事本中打开txt文件的旧程序,我使用了以下命令: 当我尝试将此代码用于Excel文件时,出现以下错误: 有什么建议吗? 问题答案: 尝试使用Desktop.open()而不是Desktop.edit(): 如果Desktop.open()不

  • 问题内容: 我正在使用子进程来调用另一个程序,并将其返回值保存到变量中。循环重复此过程,经过数千次后程序崩溃,并出现以下错误: 任何解决该问题的想法都非常感谢! 注释提供的代码: 问题答案: 我猜问题是由于我正在处理带有子进程的打开文件: 在此,cmd变量包含刚刚创建但尚未关闭的文件的名称。然后,在该文件上调用系统命令。多次执行此操作后,程序崩溃并显示该错误消息。 所以我从中学到的信息是 关闭您创

  • 我正在尝试在AWS Lambda中运行vertx WebClient。AWS Lambda最多有1024个文件描述符,并且不可调整。我很难找到到底是什么用完了我所有的文件描述符。我只使用vertx的WebClient,不运行任何verticle。这是我的共享WebClient: 此客户端在lambda调用之间重用,并且从不关闭。 我如何使用它: 我有45k-65k请求发送。我得到的是: 当我在本地

  • 问题内容: 我想为用户提供他要编辑文件的任何选项,如何使用特定文件类型的默认程序打开文件?我需要它与Windows和Linux一起使用,但是Mac选项也很棒。 问题答案: 正如PSkocik所说,首先检测平台并获取命令行: 第二,执行命令行,然后输入路径

  • 问题内容: 我一直在寻找一种方法,让用户将我的程序设置为默认值,以便在一段时间内打开文件,却一无所获。我有一个应该在Mac,Windows和Linux上通用的程序,所以我不想使用仅适用于一个OS的方法。那么,如何使用户能够将Java应用设置为默认文件打开器?我会使用桌面类吗? 问题答案: 没有Java不支持此功能。您将需要为每个要使用其本机语言(c ++,目标c等)支持的OS编写一个小型应用程序,

  • 问题内容: 我想找到在Linux中为某个进程打开的所有fds。 我可以使用glib库函数吗? 问题答案: 由于您使用的是Linux,因此(几乎可以肯定)已挂载了文件系统。这意味着最简单的方法是获取清单的内容; 其中的每个文件都以FD命名。(当然,请使用,并列出信息。) 否则获取信息会有些尴尬(例如,没有有用的POSIX API;这是一个尚未标准化的领域)。