在 iOS 上使用 MongoDB Realms 时出现 KMM 内存泄漏(RAM + 磁盘)问题

问题描述 投票:0回答:1

我过去一直在 Android 应用程序中使用 Java Realm,最近我将其迁移到 Kotlin Multiplatform,以使其与 iOS 兼容。经过测试,似乎在 iOS 环境中运行它时,我的内存因泄漏而饱和,这影响了 RAM 和磁盘(在几周的测试中它将完全填满,全部为 64Gb)。所以我做了一个非常简单的降级版本,展示了它到底失败的地方。简而言之,通过调用realm.open和realm.close方法,我泄漏了内存(根据我在Xcode上的内存图,realm_scheduler的实例,但与领域相关的任何内容似乎都会在其中创建过多的实例)。

Xcode memory illustration

简而言之,我要在 iOS 上运行的 Swift 代码仅执行此操作,这会创建一个计时器,每 0.1 秒从 RealmLeaker 实例调用leak() :

    var leaker = RealmLeaker()
    // Code skipped here for readability
        NavigationView {
            Text("A")
        }
        .onAppear() {
            var timer1 = Timer.scheduledTimer(withTimeInterval: 0.1, repeats: true) { timerI in
                // Leaking
                leaker.leak()
            }
        }

在 KMM 方面,这是 RealmLeaker 类:

class RealmLeaker {
    fun leak() {
        val config = RealmConfiguration.Builder(setOf(TestClass::class))
            .build()

        // This should simply open, then close the realm. Note that if you comment everything below this, there is no leak.
        val realm: Realm = Realm.open(config)
        realm.close()
    }
}

为了了解更多上下文,这是我在 Kotlin 端使用的“TestClass”:

// This class isn't really useful. Only there to showcase the leak, its properties are outside the scope of the problem.
class TestClass : RealmObject{
    @PrimaryKey
    var _id : String = "0"

    var value : Boolean = false
    var key : String = "test"
}

从逻辑上讲,这段代码应该只是打开和关闭 Realm,不会导致内存丢失,但它却填满了我的 RAM 和磁盘内存。

这里有一个重现错误的存储库:GitHub - ALXgba/realmKMMIssue:在 iOS 环境中运行时,在 KMM 项目中使用 Kotlin API 发生内存泄漏。 1

我确实在 MongoDB Realms GitHub 页面上提出了一个问题,但由于他们还没有回答,我希望我错过的可能是基本的,并且我可以在我的代码中修复它,因为我希望快速绕过这个问题。这是问题页面:https://github.com/realm/realm-kotlin/issues/1501

虽然使用 Xcode 调试图看来问题并没有那么严重,但它没有清楚地显示出应用程序在磁盘上的大小也在无限增长,如前所述。这意味着如果用户想经常使用该应用程序,则需要定期卸载并重新安装该应用程序,并在此过程中擦除 Realm。另外,所使用的 RAM 似乎以很小的速度增长,但我在我的实际应用程序(不是测试应用程序)中观察到它增长得足够快,当整个 RAM 被堵塞时,大约一个小时后就会崩溃。

ios swift realm kotlin-multiplatform kotlin-native
1个回答
0
投票

对于尝试此问题的任何人:

Realms 存在一个内部问题,简而言之,涉及循环依赖项从未被 iOS 的 GC 等效项收集。该问题已通过以下拉取请求关闭:https://github.com/realm/realm-kotlin/pull/1530 它尚未推送到实际版本中,但使用与其当前分支链接的 1.11.2-SNAPSHOT 修复了该问题。 (https://github.com/realm/realm-kotlin/tree/releases;有关更多信息,请参阅 README.md 中的“使用快照”)。

© www.soinside.com 2019 - 2024. All rights reserved.