Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android内存泄漏?_Java_Android_Memory Leaks - Fatal编程技术网

Java Android内存泄漏?

Java Android内存泄漏?,java,android,memory-leaks,Java,Android,Memory Leaks,我想我的android应用程序正在泄漏内存。但我不确定这是否是问题所在 每隔一段时间,应用程序在打开时就会崩溃,logcat在尝试加载位图图像时会显示“内存不足”异常 崩溃后,我重新打开应用程序,它工作正常。Logcat显示了大量的“gc”,JIT表每隔一段时间就会向上调整一次大小,直到应用程序因内存不足错误崩溃时才会向下调整 这听起来像是内存泄漏吗?如果是这样,我如何定位和关闭泄漏 这是我的应用程序的adb shell meminfo ** MEMINFO in pid 2691 [com.e

我想我的android应用程序正在泄漏内存。但我不确定这是否是问题所在

每隔一段时间,应用程序在打开时就会崩溃,logcat在尝试加载位图图像时会显示“内存不足”异常

崩溃后,我重新打开应用程序,它工作正常。Logcat显示了大量的“gc”,JIT表每隔一段时间就会向上调整一次大小,直到应用程序因内存不足错误崩溃时才会向下调整

这听起来像是内存泄漏吗?如果是这样,我如何定位和关闭泄漏

这是我的应用程序的adb shell meminfo

** MEMINFO in pid 2691 [com.example.deepcliff] **
                    native   dalvik    other    total
            size:    23264     8839      N/A    32103
       allocated:    12503     3826      N/A    16329
            free:      168     5013      N/A     5181
           (Pss):     2512     1395    13815    17722
  (shared dirty):     2088     1844     5008     8940
    (priv dirty):     2412      224    11316    13952

 Objects
           Views:        0        ViewRoots:        0
     AppContexts:        0       Activities:        0
          Assets:        2    AssetManagers:        2
   Local Binders:       55    Proxy Binders:       13
Death Recipients:        1
 OpenSSL Sockets:        0

 SQL
               heap:      129         MEMORY_USED:      129
 PAGECACHE_OVERFLOW:        9         MALLOC_SIZE:       50

 DATABASES
      pgsz     dbsz   Lookaside(b)  Dbname
         1       14             10  webview.db
         1        6             18  webviewCache.db

 Asset Allocations
    zip:/data/app/com.example.deepcliff-2.apk:/resources.arsc: 17K

这不是内存泄漏。Android设备的内存有限,你的位图肯定太大了。您需要找到一种减小位图大小的方法。我真的不能告诉你更多,因为你没有给我们太多的东西继续下去。

这里有几篇文章和帖子,可能会帮助你走上正确的道路:

AndroidSDK附带的分配跟踪器非常有用。阅读罗曼盖伊的文章。它帮助我找到了相当严重的漏洞。它还可以帮助您编写更好的软件。例如,我学会了创建更少的对象,使用更多的StringBuilder,缓存更多的内容:

有时你的应用程序是如此混乱,以至于你不得不重新设计它的整体。以下是一些官方的好提示(我最喜欢的是避免创建不必要的对象):


这里有一篇关于攻击你的记忆问题的优秀文章:

关于避免内存泄漏的官方文章:

还请阅读以下内容:




其他人已经指出了位图。这里有一篇文章描述了这个问题:

最大应用程序VM堆大小的典型值是24MB。因此,例如,如果您的图像是10Mpx(3600 x 2400),那么它将分配3600 x 2400 x 4=34'560'000字节,这是一个
OutOfMemoryError
案例。

在android中处理位图时,请确保在使用完位图后循环使用它。通过设置inSampleSize选项,可以加载调整大小的位图。此处有更多详细信息:

首先,我假设您的应用程序在刚重新启动的设备上,可以加载使用它时需要的所有位图。在活动堆栈上返回它几次会使它崩溃吗?在这种情况下,很可能是由于保留了对已销毁活动实例的引用而导致内存泄漏。1。是的,它通常工作正常。它只有在我使用了一段时间后才会崩溃,关闭它,然后再次打开它。所以,如果这是你提到的方式的泄露,我应该在哪里找到我的活动实例的参考资料。我很好奇,在某些活动中改变方向(很多)是否会产生任何影响?这将缩小潜在的错误案例。我不允许改变方向。如果可能的话,我们能看到发生“内存不足”异常的类吗?新鲜的眼睛可能会在那里发现一些东西。对不起,我将编辑我的问题。我最大的图像是一个大小约为600kb的PNG,它充当“加载”或启动屏幕。@Arjun这与讨论有点正交,但你不应该在你的移动应用程序上放置启动屏幕。这可能会让你的用户非常恼火。我还有其他各种小图标等。如果是图像大小,这不是很容易复制吗?现在我必须打开应用程序,玩上几分钟,然后关闭并打开它以获得错误。@Kurtis:我倾向于同意,但我也看到启动屏幕有合理用途的情况。例如,启动应用程序需要很长时间。“像《愤怒的小鸟》在我的手机里那样,在15秒钟内显示一个水花比一个空白的黑屏要好得多。”JarnoArgillander说得对。我完全同意手机游戏是另一个基本概念。与其他应用程序相比,我的最大图像大小只有600kb(png)(1.7m像素)。@Arjun:这已经是内存中约6.8MB的位图了。一些较旧的设备只有16MB的VM堆限制。好的,让我看看如何减小它的大小。“4”乘数是从哪里来的?代码中是否有需要清理的对象或对象引用?如果您不再使用它们,或者有一段时间不使用它们,您应该将它们设置为null,以释放内存。@Arjun:“4”乘数是每个像素的ARGB数据。还要确保没有静态地保留任何指向位图的内容。代码是否将任何活动或可绘制内容存储到静态变量中?或者它们中的任何一个存储在创建它们的类之外?当人们试图以这种方式优化内存消耗或分配时,很容易泄漏大量内存。例如,创建活动时,将位图存储到静态变量中。然后每次方向改变,应用程序都会泄漏内存。我不这么认为,至少不是故意的。我将再次检查我的代码。谢谢你的链接。好的,我有一个用户经常在活动之间切换,这意味着他们可能在20秒内切换了15个活动。这可能是内存不足错误的原因吗?我该怎么做才能修好它?谢谢