【发布时间】:2011-12-31 17:28:42
【问题描述】:
我认为我的 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
【问题讨论】:
-
首先 - 我假设您的应用程序在刚重新启动的设备上 - 可以在您使用它时加载它需要的所有位图。在activity堆栈上返回它几次会崩溃吗?在这种情况下,您很可能会通过保留对已被破坏的活动实例的引用来泄漏内存。
-
1.是的,它通常工作正常。它只是在我使用它一段时间后崩溃,然后关闭它并再次打开它。因此,如果它是您提到的方式的泄漏,我在哪里可以找到对我的活动实例的引用。
-
我很好奇在某些活动中改变方向(很多)是否会影响?这将缩小潜在的错误情况。
-
我不允许改变方向。它总是垂直的。
-
如果可能的话,我们能看到发生“内存不足”异常的类吗?新鲜的眼睛可能会在那里发现一些东西。
标签: java android memory-leaks