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