我正在使用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);
}
}
问题
答案 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的内存。