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