📌  相关文章
📜  OutOfMemory 错误是如何发生的以及如何在 Android 中解决它?

📅  最后修改于: 2022-05-13 01:58:44.510000             🧑  作者: Mango

OutOfMemory 错误是如何发生的以及如何在 Android 中解决它?

继续我们从上一篇文章中了解 OutOfMemory 错误的旅程,我们现在检查导致 Android Studio 中 OOM 错误的主要原因。每个 Android 开发者都一定遇到过 OutOfMemoryError,有时也称为 OOM。如果您还没有在您的 Android 应用程序中遇到 OOM,那么您在不久的将来就会遇到。内存泄漏会导致 Android 中的 OutOfMemoryError。要消除 OutOfMemoryError,您必须首先消除 Android 应用程序的内存泄漏。

错误!

但首先,究竟什么是内存泄漏?

当您在 Android 设备上运行应用程序时,Android 系统会为其分配内存以使其函数。例如,所有变量、函数和活动创建都单独发生在该内存中。

但是,如果您以包含对不再需要的对象的引用的方式构建代码,则垃圾收集器将无法释放未使用的空间,并且应用程序将耗尽空间。这称为内存泄漏。

由于Android中的Memory Leak现象,我们在Android中遇到OutOfMemoryError,因为您的代码持有对不再需要的对象的引用并且垃圾收集器无法执行其工作,并且您的应用程序消耗了分配给它的所有空间由Android系统和要求更多。

OutOfMemoryError 的原因可能是什么?

Android 中的 OutOfMemoryError 可能由于多种原因而发生。以下是导致 OutOfMemoryError 的内存泄漏的一些最典型原因:

  • 非静态的内部类
  • 错误地使用 getContext() 和 getApplicationContext()
  • 静态视图、上下文或活动的应用

让我们一个一个地浏览它们:

1. 非静态的内部类

如果您的应用程序中有嵌套类,请将其设为静态类,因为静态类不需要对外部类的隐式引用。如果您使内部类非静态,则外部类将处于活动状态,直到应用程序处于活动状态。如果您的类使用大量内存,这可能会导致 OutOfMemoryError。因此,最好将内部类设为静态。在Java中,您必须手动将内部类设为静态,而在 Kotlin 中,内部类默认为静态。在 Kotlin 中,您不必担心静态内部类。

2.getContext()和getApplicationContext()的使用错误()

在我们的应用程序中,我们使用了很多第三方库,其中大部分使用了 Singleton 类。如果您需要为超出当前活动范围的第三方库提供一些上下文,请使用 getApplicationContext() 而不是 getContext()。就像在下面的示例中一样, initialize 是库中使用上下文的静态函数

Java
SomeLibrary
{
    object companion
    {
        initializeGeeksforGeeksLib(Content context)
        {
            this.context = context.getApplicationContext()
        }
    }
}


然而,一些库不使用上述符号。因此,在这种情况下,它将使用当前活动的上下文,并且当前活动的引用将一直保留到应用程序处于活动状态,这可能会导致 OutOfMemoryError(因为初始化函数是静态的)。因此,最好直接在代码中使用 getApplicationContext() 而不是依赖第三方库。这些是从我们的应用程序中消除 OutOfMemoryError 的一些方法。最好编写不会导致 OutOfMemoryError 的代码。尽管如此,如果您的项目很大并且您在查找导致 OutOfMemoryError 的类时遇到问题,您可以利用 Android Studio 的内存分析器来定位导致 OutOfMemoryError 的类。

3. 静态视图、上下文或活动的应用

如果您使用任何静态视图、上下文或活动(如果您的活动处理大量空间),则会发生 OutOfMemoryError。这是因为程序将持有视图、上下文或活动,直到应用程序处于活动状态,并且这些使用的内存不会被垃圾收集器释放。