Hello World Android APP的意外堆转储

Dil*_*ngh 26 heap memory-leaks memory-management heap-memory android-5.0-lollipop

我正在使用Eclipse中的MAT学习内存利用率.虽然我遇到了一个奇怪的问题.抛开沉重的应用程序,我开始使用最温和的"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

我的堆转储给了我3个内存泄漏嫌疑人:概述

"由于声誉低,不能发布饼图."

问题可疑1

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

关键字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);
}
Run Code Online (Sandbox Code Playgroud)

}

问题

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

yad*_*dhu 6

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