Hello World Android APP的意外堆转储

时间:2015-03-07 17:23:32

标签: memory-management memory-leaks heap android-5.0-lollipop heap-memory

我正在使用Eclipse中的MAT学习内存利用率。虽然我遇到了一个奇怪的问题。抛开沉重的应用程序,我从最良性的The#34; Hello World"应用。这就是我在 Nexus 5,ART运行时,Lollipop 5.0.1上获得的Heap Stats。

ID :1
堆大小:25.429 MB
已分配:15.257 MB
免费:10.172 MB
%使用:60%
#Objects :43487

My Heap dump给了我3个内存泄漏嫌疑人: 概述

"由于声誉不佳,无法发布饼图。"

问题疑似1

  

由""加载的类" android.content.res.Resources"占用10,166,936(38.00%)个字节。记忆是   积累在" android.util.LongSparseArray []"的一个实例中装   by""。

     

关键字android.util.LongSparseArray [] android.content.res.Resources

问题可疑2

  

" android.graphics.NinePatch"的209个实例,由""加载占用5,679,088(21.22%)个字节。这些实例是   从一个" java.lang.Object []"的一个实例引用,加载   ""关键字java.lang.Object []   android.graphics.NinePatch

问题可疑3

  

" java.lang.reflect.ArtMethod []"的8个实例,由""加载占用3,630,376(13.57%)个字节。最大的实例:   •java.lang.reflect.ArtMethod [62114] @ 0x70b19178 - 1,888,776(7.06%)   字节。 •java.lang.reflect.ArtMethod [21798] @ 0x706f5a78 - 782,800   (2.93%)字节。 •java.lang.reflect.ArtMethod [24079] @ 0x70a9db88 -   546,976(2.04%)字节。关键字java.lang.reflect.ArtMethod []

这只是一个简单的代码:

import android.app.Activity;
import android.os.Bundle;

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
}

}

问题

  1. 为什么堆数如此之大。 ? 另外作为旁注,该应用程序在系统中消耗了52 MB的RAM。
  2. 这些 NinePatch 的209个实例将在哪里?我只是通过做一个"创建一个新项目"来创建项目。在Eclipse?
  3. 第一个泄漏资源的嫌疑人,它在我的应用程序分析中一直出现。这真是一个嫌疑人吗?
  4. 什么是ArtMethod?是否必须对ART运行时执行某些操作?

2 个答案:

答案 0 :(得分:6)

在Lollipop中,默认运行时是ART,即Android Run Time。用于代替Dalvik运行时的用于较旧的Android版本。 在Kitkat谷歌发布了ART的实验版本,以获得用户的反馈。 在dalvik中使用JIT(即时编译),意味着当您打开应用程序时,只有dex代码被转换为目标代码。 但是在安装时的ART中,只有dex代码被转换为目标代码(即AOT提前编译)。这个目标代码的大小与dex代码相比更多,因此ART需要比Dalvik更多的RAM,因为它的AOT应用程序在ART中比Dalvik工作得更快。

答案 1 :(得分:0)

昨天我也遇到了这个问题。在您的日志中,关键字是“NinePatch”。在我的情况下,原因是一个“虚假”的阴影 - 带有alpha通道的小图片会触发资源泄漏。这对我来说耗费了大约60mb的内存。