我正在使用 Eclipse 中的 MAT 学习内存利用率。虽然我遇到了一个奇怪的问题。撇开繁重的应用程序不谈,我从最温和的“Hello World”应用程序开始。这是我在 上获得的堆统计信息Nexus 5、ART 运行时、Lollipop 5.0.1。
编号 : 1
堆大小 : 25.429 MB
已分配 : 15.257 MB
免费 : 10.172 MB
% 使用 : 60%
# 对象 : 43487
我的堆转储给了我 3 个内存泄漏嫌疑人:
概述
“由于声誉低,无法发布饼图。”
问题嫌疑人1
The class "android.content.res.Resources", loaded by "", occupies 10,166,936 (38.00%) bytes. The memory is accumulated in one instance of "android.util.LongSparseArray[]" loaded by "".
Keywords android.util.LongSparseArray[] android.content.res.Resources
问题嫌疑人2
209 instances of "android.graphics.NinePatch", loaded by "" occupy 5,679,088 (21.22%) bytes. These instances are referenced from one instance of "java.lang.Object[]", loaded by "" Keywords java.lang.Object[] android.graphics.NinePatch
问题嫌疑人3
8 instances of "java.lang.reflect.ArtMethod[]", loaded by "" occupy 3,630,376 (13.57%) bytes. Biggest instances: •java.lang.reflect.ArtMethod[62114] @ 0x70b19178 - 1,888,776 (7.06%) bytes. •java.lang.reflect.ArtMethod[21798] @ 0x706f5a78 - 782,800 (2.93%) bytes. •java.lang.reflect.ArtMethod[24079] @ 0x70a9db88 - 546,976 (2.04%) bytes. Keywords 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);
}
}
问题
另外作为附带说明,该应用程序在系统中消耗了 52 MB 的 RAM。
请您参考如下方法:
在 Lollipop 中,默认运行时是 ART,即 Android 运行时,它取代了旧 Android 版本中使用的旧 Dalvik 运行时 (DRT)。
在 KitKat 中,谷歌发布了一个实验版的 ART 来获取用户的反馈。
在 Dalvik 中使用 JIT(即时编译),这意味着当您打开应用程序时,DEX 代码才被转换为目标代码。
然而,在 ART 中,dex 代码在安装过程中被转换为目标代码(即 AOT 提前编译)。与 DEX 代码相比,此目标代码的大小更大,因此 ART 需要比 DRT 更多的 RAM。 ART 的优势在于 ART 应用程序比 DRT 应用程序具有更好的响应时间。