代码之家  ›  专栏  ›  技术社区  ›  Mike Keskinov

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

  •  0
  • Mike Keskinov  · 技术社区  · 5 年前

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

    2021-06-13 04:14:59.610 30892-30994/com.maxilab.mafia E/SQLiteDatabase:无法打开数据库 '/data/user/0/com.mafalab.mafia/databases/google_app_measurement_local.db'。 android.database.sqlite。SQLiteCantOpenDatabaseException:未知错误(代码2062):无法打开数据库 ################################################################# 错误代码:2062(SQLITE_CANTOPEN_EMFILE) 原因:应用程序打开的文件太多。默认情况下,一个进程中可用文件描述符的最大值为1024。 (未知错误(代码2062):无法打开数据库) ################################################################# 位于android.database.sqlite。SQLiteConnection.natureOpen(本机方法) 位于android.database.sqlite。SQLiteConnection.open(SQLiteConnection.java:262) 位于android.database.sqlite。SQLiteConnection.open(SQLiteConnection.java:205) 位于android.database.sqlite。SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:649) 位于android.database.sqlite。SQLiteConnectionPool.open(SQLiteConnectionPool.java:255) 位于android.database.sqlite。SQLiteConnectionPool.open(SQLiteConnectionPool.java:222) 位于android.database.sqlite。SQLiteDatabase.openInner(SQLiteDatabase.java:1191) 位于android.database.sqlite。SQLiteDatabase.open(SQLiteDatabase.java:1146) 位于android.database.sqlite。SQLiteDatabase.openDatabase(SQLiteDatabase.java:861) 在android.app上。ContextImpl.openOrCreateDatabase(ContextImpl.java:729) 在android.content。ContextWrapper.openOrCreateDatabase(ContextWrapper.java:310) 位于android.database.sqlite。SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:254) 位于android.database.sqlite。SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:194) 网址:com.google.android.gms.measurement.internal.zzef.getWritableDatabase(com.google.aAndroid.gms:play services-measurement-inpl@@19.0.0:1) 网址:com.google.android.gms.measurement.internal.zzeg.zzo(com.google.aAndroid.gms:play services-measurement-inpl@@19.0.0:1) 网址:com.google.android.gms.measurement.internal.zzeg.zzq(com.google.aAndroid.gms:play services-measurement-inpl@@19.0.0:6) 网址:com.google.android.gms.measurement.internal.zze.zzi(com.google.aAndroid.gms:play services-measurement-inpl@@19.0.0:9) 网址:com.google.android.gms.measurement.internal.zzjk.zzl(com.google.aAndroid.gms:play services-measurement-inpl@@19.0.0:6) 网址:com.google.android.gms.measurement.internal.zzhw.zzu(com.google.aAndroid.gms:play services-measurement-inpl@@19.0.0:147) 网址:com.google.android.gms.measurement.internal.zzhc.run(com.google.aAndroid.gms:play services-measurement-inpl@@19.0.0:1) 位于java.util.concurrent。Executors$RunnableAdapter.call(Executors.java:457) 位于java.util.concurrent。FutureTask.run(FutureTask.java:266) 网址:com.google.android.gms.measurement.internal.zzfq.run(com.google.aAndroid.gms:play services-measurement-inpl@@19.0.0:6) 2021-06-13 04:14:59.619 30892-30994/com.maxilab.mafia E/FA:开幕 本地数据库失败,正在删除并重新创建它2021-06-13 04:14:59.622 30892-30994/commarialab.mafia W/SQLiteLog:(28)失败 打开 “/data/user/0.com/mayalab.mafia/databases/google_app_measurement_local.db” 由于错误(24)2021-06-13,具有标志(131138)和mode_t(0) 04:14:59.622 30892-30994/commarialab.mafia W/SQLiteLog:(28)失败 打开 “/data/user/0.com/mayalab.mafia/databases/google_app_measurement_local.db” 由于错误(24)2021-06-13,具有标志(131072)和mode_t(0) 04:14:59.622 30892-30994/com.maxilab.mafia E/SQLiteLog:(14)不能 在[4b21d8205]2021-06-13 04:14:59.622的第36170行打开文件 30892-30994/com.maxilab.mafia E/SQLiteLog:(14)os_unix.c:36170:(24) 打开(/data/user/0.com/mayalab.mafia/databases/google_app_measurement_local.db)

    • 2021-06-13 04:14:59.622 30892-30994/com.maxilab.mafia E/SQLiteLog:(1)过程:Pid(30892)Uid(10190)Euid(10190Gid(10190Egid) (10190)2021-06-13 04:14:59.624 30892-30994/com.maxilab.mafia E/SQLiteDatabase:无法打开数据库 '/data/user/0/com.mafalab.mafia/databases/google_app_measurement_local.db'。 android.database.sqlite。SQLiteCantOpenDatabaseException:未知错误(代码2062):无法打开数据库 ################################################################# 错误代码:2062(SQLITE_CANTOPEN_EMFILE) 原因:应用程序打开的文件太多。默认情况下,一个进程中可用文件描述符的最大值为1024。 (未知错误(代码2062):无法打开数据库) ################################################################# 位于android.database.sqlite。SQLiteConnection.natureOpen(本机方法) 位于android.database.sqlite。SQLiteConnection.open(SQLiteConnection.java:262) 位于android.database.sqlite。SQLiteConnection.open(SQLiteConnection.java:205) 位于android.database.sqlite。SQLiteConnectionPool.openConnectionLocked(SQLiteConnectionPool.java:649) 位于android.database.sqlite。SQLiteConnectionPool.open(SQLiteConnectionPool.java:255) 位于android.database.sqlite。SQLiteConnectionPool.open(SQLiteConnectionPool.java:222) 位于android.database.sqlite。SQLiteDatabase.openInner(SQLiteDatabase.java:1191) 位于android.database.sqlite。SQLiteDatabase.open(SQLiteDatabase.java:1146) 位于android.database.sqlite。SQLiteDatabase.openDatabase(SQLiteDatabase.java:861) 在android.app上。ContextImpl.openOrCreateDatabase(ContextImpl.java:729) 在android.content。ContextWrapper.openOrCreateDatabase(ContextWrapper.java:310) 位于android.database.sqlite。SQLiteOpenHelper.getDatabaseLocked(SQLiteOpenHelper.java:254) 位于android.database.sqlite。SQLiteOpenHelper.getWritableDatabase(SQLiteOpenHelper.java:194) 网址:com.google.android.gms.measurement.internal.zzef.getWritableDatabase(com.google.aAndroid.gms:play services-measurement-inpl@@19.0.0:9) 网址:com.google.android.gms.measurement.internal.zzeg.zzo(com.google.aAndroid.gms:play services-measurement-inpl@@19.0.0:1) 网址:com.google.android.gms.measurement.internal.zzeg.zzq(com.google.aAndroid.gms:play services-measurement-inpl@@19.0.0:6) 网址:com.google.android.gms.measurement.internal.zze.zzi(com.google.aAndroid.gms:play services-measurement-inpl@@19.0.0:9) 网址:com.google.android.gms.measurement.internal.zzjk.zzl(com.google.aAndroid.gms:play services-measurement-inpl@@19.0.0:6) 网址:com.google.android.gms.measurement.internal.zzhw.zzu(com.google.aAndroid.gms:play services-measurement-inpl@@19.0.0:147) 网址:com.google.android.gms.measurement.internal.zzhc.run(com.google.aAndroid.gms:play services-measurement-inpl@@19.0.0:1) 位于java.util.concurrent。Executors$RunnableAdapter.call(Executors.java:457) 位于java.util.concurrent。FutureTask.run(FutureTask.java:266) 网址:com.google.android.gms.measurement.internal.zzfq.run(com.google.aAndroid.gms:play services-measurement-inpl@@19.0.0:6) 2021-06-13 04:14:59.625 30892-30994/com.maxilab.mafia E/FA:失败 打开本地数据库。事件将绕过本地存储: android.database.sqlite。SQLiteCantOpenDatabaseException:未知错误 (代码2062):无法打开数据库 ################################################################# 错误代码:2062(SQLITE_CANTOPEN_EMFILE) 原因:应用程序打开的文件太多。默认情况下,一个进程中可用文件描述符的最大值为1024。 (未知错误(代码2062):无法打开数据库) #################################################################:com.google.android.gms.measurement.internal.zzef.getWritableDatabase(com.google.aAndroid.gms:play services measurement impl@@19.0.0:9)
    0 回复  |  直到 5 年前
        1
  •  0
  •   bwt    5 年前

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

    您可以列出它们:

    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