我正在申请观看电影,这些电影在网格,列表和水平滚动视图中显示类别和电影的图像。 应用程序有几个活动,每个活动都显示图像。 Proglem就是当用户更改活动时,只有一个点应用程序崩溃并出现OutOfMemory异常。
使用Heap和MAT工具我发现位图在每个活动中都使用了大量的堆内存。在同样的手机上,如三星Galaxy S4和Alcatel OneTouch Idol以及全高清显示屏,应用程序仅在2-3个活动中崩溃。那太疯狂了:))
所以,我的问题是,如何用记忆克服这个问题? 我知道这是普通的Android问题,但我必须要做些什么才能解决这个问题。
每个图像的位置都是最佳的(图像尺寸在附加到图像视图之前精确测量)。 欢呼声。
答案 0 :(得分:1)
做一些分析。
您没有提供任何代码或日志。所以,会告诉您我遵循的基本方法。
开始你的第一项活动。继续运行adb shell dumpsys" PID"或" PackageName"
重现活动时获取信息。
执行adb shell " while true ; do dumpsys meminfo 22188 ; done ; " > dumpsysOfsmthn.txt
* MEMINFO in pid 22188 [com.sec.android.smthn] **
Pss Private Private Swapped Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap 44 44 0 0 11132 10455 184
Dalvik Heap 19189 18804 0 0 25660 19221 6439
Dalvik Other 3891 3828 0 0
Stack 200 200 0 0
Ashmem 2 0 0 0
Other dev 8168 7844 4 0
.so mmap 1990 1032 508 0
.jar mmap 5 0 4 0
.apk mmap 315 0 124 0
.ttf mmap 21 0 4 0
.dex mmap 6553 248 5584 0
Other mmap 90 4 20 0
Unknown 5743 5740 0 0
TOTAL 46211 37744 6248 0 36792 29676 6623
Objects
Views: 39 ViewRootImpl: 1
AppContexts: 4 Activities: 1
Assets: 3 AssetManagers: 3
Local Binders: 78 Proxy Binders: 42
Death Recipients: 2
OpenSSL Sockets: 0
SQL
MEMORY_USED: 286
PAGECACHE_OVERFLOW: 53 MALLOC_SIZE: 62
DATABASES
pgsz dbsz Lookaside(b) cache Dbname
4 24 53 2/17/3 /data/data/com.sec.android.smthn/databases/sns.db
4 32 55 1/13/2 /data/data/com.sec.android.smthn/databases/picasa.db
4 36 27 10/17/3 /data/data/com.sec.android.smthn/databases/local.db
Applications Memory Usage (kB):
Uptime: 31556347 Realtime: 96096816
检查部分哪个部分不断增加。
可能是ViewRootImpl或活动上下文或任何内容。
以上信息可能会让您了解一些线索。
如上所述,请使用MAT或JHAT对heapdump进行分析。 Mat是一个令人敬畏的工具恕我直言。
you should look for memory leaks caused by:
Long-lived references to an Activity, Context, View, Drawable, and other objects that may hold a reference to the container Activity or Context.
Non-static inner classes (such as a Runnable, which can hold the Activity instance).
Caches that hold objects longer than necessary.
任何Object都可能导致泄漏。一般情况下位图很大。如果内存非常容易发生,那么你需要检查像位图这样的重物。
对MAT和Leaks的理解Click this
this。
除了上述内容之外,您还可以使用DDMS分配跟踪器获取更多线索>是的,没有什么能比MAT获得更好的数据。
同时查看此帖子。 Very informative