You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Cloud Firestore(24.10.0)内部错误:CursorWindowAllocationException求助

解决Cloud Firestore的CursorWindowAllocationException错误

我的应用已发布2年,从发布首日起就罕见但持续收到如下错误提示:Internal error in Cloud Firestore (24.10.0) - android.database.CursorWindowAllocationException: Cursor window allocation。错误显示为“Internal Error”,不确定这是否是Firebase的bug,也不清楚能否自行处理。

Firebase依赖配置

implementation platform('com.google.firebase:firebase-bom:32.7.0')
implementation 'com.google.firebase:firebase-analytics'
implementation 'com.google.firebase:firebase-auth'
implementation 'com.google.firebase:firebase-firestore'
implementation 'com.google.firebase:firebase-crashlytics'
implementation 'com.google.firebase:firebase-appcheck-playintegrity'
implementation 'com.google.firebase:firebase-appcheck-debug'

完整堆栈跟踪

Fatal Exception: java.lang.RuntimeException: Internal error in Cloud Firestore (24.10.0).
    at com.google.firebase.firestore.util.AsyncQueue.lambda$panic$3(AsyncQueue.java:545)
    at android.os.Handler.handleCallback(Handler.java:907)
    at android.os.Handler.dispatchMessage(Handler.java:105)
    at android.os.Looper.loop(Looper.java:216)
    at android.app.ActivityThread.main(ActivityThread.java:7625)
    at java.lang.reflect.Method.invoke(Method.java)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:524)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:987)

Caused by java.lang.RuntimeException: android.database.CursorWindowAllocationException: Cursor window allocation of 2097152 bytes failed. 
    at com.google.firebase.firestore.util.AsyncQueue$SynchronizedShutdownAwareExecutor.lambda$executeAndReportResult$1(AsyncQueue.java:333)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:458)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
    at java.util.concurrent.ThreadPoolExecutor.processTask(ThreadPoolExecutor.java:1187)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1152)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at com.google.firebase.firestore.util.AsyncQueue$SynchronizedShutdownAwareExecutor$DelayedStartFactory.run(AsyncQueue.java:235)
    at java.lang.Thread.run(Thread.java:784)

Caused by android.database.CursorWindowAllocationException: Cursor window allocation of 2097152 bytes failed. 
    at android.database.CursorWindow.<init>(CursorWindow.java:136)
    at android.database.CursorWindow.<init>(CursorWindow.java:114)
    at android.database.AbstractWindowedCursor.clearOrCreateWindow(AbstractWindowedCursor.java:198)
    at android.database.sqlite.SQLiteCursor.fillWindow(SQLiteCursor.java:143)
    at android.database.sqlite.SQLiteCursor.getCount(SQLiteCursor.java:137)
    at android.database.AbstractCursor.moveToPosition(AbstractCursor.java:220)
    at android.database.AbstractCursor.moveToNext(AbstractCursor.java:269)
    at com.google.firebase.firestore.local.SQLitePersistence$Query.forEach(SQLitePersistence.java:493)
    at com.google.firebase.firestore.local.SQLiteRemoteDocumentCache.getAll(SQLiteRemoteDocumentCache.java:143)
    at com.google.firebase.firestore.local.LocalStore.lambda$writeLocally$2(LocalStore.java:248)
    at com.google.firebase.firestore.local.SQLitePersistence.runTransaction(SQLitePersistence.java:228)
    at com.google.firebase.firestore.local.LocalStore.writeLocally(LocalStore.java:240)
    at com.google.firebase.firestore.core.SyncEngine.writeMutations(SyncEngine.java:286)
    at com.google.firebase.firestore.core.FirestoreClient.lambda$write$12(FirestoreClient.java:233)
    at com.google.firebase.firestore.util.AsyncQueue.lambda$enqueue$2(AsyncQueue.java:444)
    at com.google.firebase.firestore.util.AsyncQueue$SynchronizedShutdownAwareExecutor.lambda$executeAndReportResult$1(AsyncQueue.java:330)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:458)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
    at java.util.concurrent.ThreadPoolExecutor.processTask(ThreadPoolExecutor.java:1187)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1152)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:641)
    at com.google.firebase.firestore.util.AsyncQueue$SynchronizedShutdownAwareExecutor$DelayedStartFactory.run(AsyncQueue.java:235)
    at java.lang.Thread.run(Thread.java:784)

可行的修复措施

1. 升级Firebase依赖版本

当前使用的BOM版本32.7.0对应的Firestore 24.10.0存在已知的CursorWindow内存分配问题。建议升级到最新稳定版Firebase BOM,新版本会修复底层SQLite操作的内存管理缺陷:

implementation platform('com.google.firebase:firebase-bom:33.1.0')

其他Firebase依赖无需单独指定版本,BOM会自动管理所有库的兼容版本。

2. 优化Firestore本地缓存

错误源于Firestore读取本地SQLite缓存时无法分配2MB的CursorWindow,通常是缓存文档过多或单文档体积过大导致:

  • 在合适时机调用FirebaseFirestore.getInstance().clearPersistence()清理本地缓存,比如应用启动时或用户主动触发,但注意这会导致下次启动需重新同步数据;
  • 通过FirestoreSettings限制缓存大小,避免无限增长:
    FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
            .setCacheSizeBytes(100 * 1024 * 1024) // 设置为100MB,可根据需求调整
            .build();
    FirebaseFirestore.getInstance().setFirestoreSettings(settings);
    

3. 拆分批量写入操作

堆栈显示错误发生在写入操作的本地持久化阶段,若应用存在批量写入大量文档的场景,拆分操作分批次执行,避免一次性触发大量SQLite操作导致内存压力过载。

4. 监控设备内存状态

低内存设备更容易触发该问题,可在应用中添加内存监控,当设备内存不足时,暂停非必要的Firestore操作,或提示用户清理存储空间。

5. 反馈给Firebase官方

若升级依赖和应用层面优化后问题仍存在,可将完整崩溃日志、设备信息(Android版本、型号)提交给Firebase支持,确认是否为未修复的底层bug。

内容的提问来源于stack exchange,提问作者Adam Varhegyi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 06:21:06