当前位置: 首页 > 知识库问答 >
问题:

Hello World Android应用的意外堆转储

吕向阳
2023-03-14

我正在学习在Eclipse中使用MAT的内存利用率。虽然我遇到了一个奇怪的问题。撇开繁重的应用程序不谈,我从最温和的“Hello World”应用程序开始。这是我在Nexus 5、ART runtime和Lollipop5.0.1上获得的堆统计数据。

ID:1
堆大小:25.429 MB
分配:15.257 MB
空闲:10.172 MB
%使用:60%
#对象:43487

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

"不能发布饼图,因为声誉低."

问题嫌疑人1

由“”加载的类“android.content.res.Resources”占用10166936(38.00%)字节。内存累积在由“”加载的“android.util.LongSparseArray[]的一个实例中。

关键词android.util.LongSparseArray[]android.content.res.资源

问题嫌疑犯2

由“”加载的209个“android.graphics.NinePatch”实例占用5679088(21.22%)字节。这些实例引用自“java.lang.Object[]”的一个实例,该实例由“”关键字java加载。lang.Object[]android。图样九匹

问题疑犯3

由“”加载的8个“java.lang.reflect.ArtMethod[]”实例占用3630376(13.57%)字节。最大的例子:•java。朗,反思一下。ArtMethod[62114]@0x70b19178-1888776(7.06%)字节JAVA朗,反思一下。ArtMethod[21798]@0x706f5a78-782800(2.93%)字节。•JAVA朗,反思一下。ArtMethod[24079]@0x70a9db88-546976(2.04%)字节。关键词java。朗,反思一下。艺术方法

这是一个简单的代码:

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. 这些209个NinePatch实例来自哪里?我只是通过在Eclipse中执行“创建新项目”来创建项目?
  3. 资源的第一个泄漏嫌疑人,在我对应用程序的分析中经常出现。它真的是嫌疑人吗?
  4. 什么是ArtMethod?它必须与ART运行时做些什么吗?

共有2个答案

刘子实
2023-03-14

昨天我也面临着这个问题。在你的日志中,关键词是“NinePatch”。在我的例子中,原因是一个“假”阴影——带有阿尔法通道的微小图片,它会触发资源泄漏。对我来说,它的成本约为60mb泄漏内存。

郭志
2023-03-14

在Lollipop中,默认运行时是ART,即Android运行时,它取代了旧Android版本中使用的旧Dalvik运行时(DRT)。在KitKat,谷歌发布了一个实验版的ART,以获得用户的反馈。在Dalvik中,使用了JIT(即时编译),这意味着当您打开应用程序时,DEX代码才会转换为目标代码。然而,在艺术中,dex代码在安装过程中转换为目标代码(即AOT提前编译)。与DEX代码相比,该目标代码的大小更大,因此ART需要比DRT更多的RAM。ART的优势在于,ART应用程序比DRT应用程序有更好的响应时间。

 类似资料:
  • Android应用程序初学者有一些问题,应用程序无法打开。今晚才开始用它工作。eclipse中的代码上没有显示错误。就在我试图从模拟器运行它时,它意外地关闭了。 主要来源:包装com.example.solidshellsecurity; XML: 错误日志:

  • 从中提取代码的类确实需要隐式转换和。那么,有没有一种方法可以在不明确转换的情况下防止这种行为呢?

  • 我正在尝试创建一个用户登录页面,当我尝试注册时,我得到了这个错误。我想Json对象部分有问题。我尝试在论坛中搜索其他答案,但似乎都没有解决我的问题。请求你帮我解决这个问题。谢谢是提前的。 我的原木猫

  • 我在将时间戳对象转换为joda的LocalTime时遇到问题。 参见以下示例: 我无法确定为什么“new LocalDate(t)”会导致“1111-11-17”。有人能帮我吗? 在使用joda time hibernate填充bean的LocalDate类型属性时,我注意到了这个“问题”。

  • 问题内容: 我需要一种 从应用程序内部 请求堆转储 的方法 。 基本原理:当遇到特定的错误情况时,我想转储堆,以便可以看到内存中有什么内容。 但是我想使它自动化(例如,当我检测到某些特定情况发生时。或者当看门狗不再收到ping命令时;当某些测试失败时)。因此,我需要一种从应用程序本身内部转储堆的方法。我似乎无法通过MX bean的东西找到它。尽管MX Bean可以通过监视器和“可拥有的同步器”信息

  • 问题内容: 我试图了解为什么将时区转换为UTC时会得到这些结果: 为什么早上6:30变成下午2:23? 另一方面,如果使用以下方法,则会得到预期的结果: 问题答案: 从部分文档中:http : //pytz.sourceforge.net/#localized-times-and-date- arithmetic 不幸的是,在许多时区中,使用标准datetime构造函数的tzinfo参数对pytz