草庐IT

android - 内存和 Activity::OutOfMemory

coder 2023-12-09 原文

设置:

我有这个应用程序,它在线性路径中有 4 个 Activity ,非常简单的导航: A -> B -> C -> D

所有 Activity 共享相同的背景图片,并且都有几个常规按钮、 TextView 或编辑文本。所有这些都在单独的 View xml 文件中定义。

背景是渐变的,有点厚重。大约 3 兆作为未压缩的位图。

该应用程序尚未执行任何操作,其中唯一的逻辑是启动 Activity 并在单击按钮时关闭它们

我尝试使用 MAT 查找内存泄漏,但找不到任何东西。我的应用程序中最大的保留大小是 656(ko?),应用程序的总保留大小是 1520(ko?),我找不到任何可以重复的对象。 顺便说一下,这与显示 27300(ko?) 已分配的 dumpsys 完全矛盾

问题:

  1. 当我向上导航时,我看到内存使用量的增加相当于背景大小。
  2. 当我向下导航、使用后退按钮或完成命令关闭 Activity 时,应用程序的内存使用量不会减少。
  3. 如果我从 A 转到 D,然后返回 B 并旋转屏幕,应用会强制关闭并出现 OutOfMemory 异常。

问题:

更新:我想真正的问题是为什么我在卡住时有一个 27 兆的应用程序大小的巨大内存泄漏(一次 5 兆),而我在 MAT 中看不到它?

  1. 为什么 Android 会多次解压相同的背景,每个 Activity 一次?似乎效率低下。
  2. 是否可以通过使用主题来解决这个问题,或者我会看到同样的“按 Activity 分配 1 个背景”的怪异现象吗?
  3. 为什么 Activity 在关闭时没有被回收?
  4. 为什么 MAT 和 dumpsys 显示不同的数字?

线索

同时我有: dumpsys 内存信息:

Applications Memory Usage (kB):
Uptime: 74006853 Realtime: 110962243

** MEMINFO in pid 22683 [com.kayenko.sosadresse] **
                    native   dalvik    other    total
            size:    20820     5767      N/A    26587
       allocated:    18751     2901      N/A    21652
            free:      312     2866      N/A     3178
           (Pss):     1357      201    16782    18340
  (shared dirty):     2264     1804     5456     9524
    (priv dirty):     1280      116    16032    17428

 Objects
           Views:        0        ViewRoots:        0
     AppContexts:        0       Activities:        0
          Assets:        2    AssetManagers:        2
   Local Binders:       18    Proxy Binders:       16
Death Recipients:        1
 OpenSSL Sockets:        0

 SQL
               heap:        0         MEMORY_USED:        0
 PAGECACHE_OVERFLOW:        0         MALLOC_SIZE:        0

还有这棵支配树:

感谢任何知道我应该寻找什么的人。

最佳答案

内存在 Android 中是一个非常棘手的主题。

每个应用程序都会根据设备获得堆内存限制。此堆内存是 dalvik 内存加上 native 内存,您可以将其视为 dumpsys meminfo 结果中的总列。 dalvik 内存处理除位图之外的所有内容,这些位图分配在 native 内存中(这对于 Honeycomb 之前的 Android 版本是正确的)。

话虽如此,我只能回答您的部分问题:

  1. 据我所知,Android 总是会为位图分配内存,即使它们是相同的。因此,在您的情况下,每个 Activity 都会为您的后台分配内存。

  2. 我不知道使用主题是否更好,你必须尝试一下。

  3. 一方面,当设备有足够的内存来处理下一个 Activity 时, Activity 不会被回收。当您按下后退按钮时,每个 Activity 都会被推到一堆,从那里恢复。如果 Android 需要更多内存,它会从堆中移除一个 Activity ,重新分配其内存(回到第一个问题,也许这就是不共享内存的原因)。另一方面,您可以设置 Activity launchMode 来更改此行为(查看 here )。

  4. 我认为 MAT 不显示 native 内存数据。使用 dumpsys meminfo 的 native 列查看为位图分配了多少内存。

我自己在处理 OutOfMemory 问题时遇到了困难。现在我有了更清晰的想法 它是如何工作的,我能够在不耗尽内存的情况下处理大文件。我强烈推荐这两个对我有很大帮助的资源:

祝你好运!

关于android - 内存和 Activity::OutOfMemory,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9022679/

有关android - 内存和 Activity::OutOfMemory的更多相关文章

  1. ruby-on-rails - Ruby net/ldap 模块中的内存泄漏 - 2

    作为我的Rails应用程序的一部分,我编写了一个小导入程序,它从我们的LDAP系统中吸取数据并将其塞入一个用户表中。不幸的是,与LDAP相关的代码在遍历我们的32K用户时泄漏了大量内存,我一直无法弄清楚如何解决这个问题。这个问题似乎在某种程度上与LDAP库有关,因为当我删除对LDAP内容的调用时,内存使用情况会很好地稳定下来。此外,不断增加的对象是Net::BER::BerIdentifiedString和Net::BER::BerIdentifiedArray,它们都是LDAP库的一部分。当我运行导入时,内存使用量最终达到超过1GB的峰值。如果问题存在,我需要找到一些方法来更正我的代

  2. ruby-on-rails - Ruby 中的内存模型 - 2

    ruby如何管理内存。例如:如果我们在执行过程中采用C程序,则以下是内存模型。类似于这个ruby如何处理内存。C:__________________|||stack|||------------------||||------------------|||||Heap|||||__________________|||data|__________________|text|__________________Ruby:? 最佳答案 Ruby中没有“内存”这样的东西。Class#allocate分配一个对象并返回该对象。这就是程序

  3. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  4. 键删除后 ruby​​ 哈希内存泄漏 - 2

    你好,我无法成功如何在散列中删除key后释放内存。当我从哈希中删除键时,内存不会释放,也不会在手动调用GC.start后释放。当从Hash中删除键并且这些对象在某处泄漏时,这是预期的行为还是GC不释放内存?如何在Ruby中删除Hash中的键并在内存中取消分配它?例子:irb(main):001:0>`ps-orss=-p#{Process.pid}`.to_i=>4748irb(main):002:0>a={}=>{}irb(main):003:0>1000000.times{|i|a[i]="test#{i}"}=>1000000irb(main):004:0>`ps-orss=-p

  5. ruby-on-rails - HTTParty 的内存问题和下载大文件 - 2

    这会导致Ruby出现内存问题吗?我知道如果大小超过10KB,Open-URI会写入TempFile。但是HTTParty会在写入TempFile之前尝试将整个PDF保存到内存吗?src=Tempfile.new("file.pdf")src.binmodesrc.writeHTTParty.get("large_file.pdf").parsed_response 最佳答案 您可以使用Net::HTTP。参见thedocumentation(特别是标题为“流媒体响应机构”的部分)。这是文档中的示例:uri=URI('http://e

  6. ruby-on-rails - 内存中具有相同 ID 的更多对象? - 2

    在部署在heroku上的Rails应用程序(v:3.1)中,我在内存中获得了更多具有相同ID的对象。我的heroku控制台日志:>>Project.find_all_by_id(92).size=>2>>ActiveRecord::Base.connection.execute('select*fromprojectswhereid=92').to_a.size=>1这怎么可能?可能是什么问题? 最佳答案 解决方案根据您的SQL查询,您的数据库中显然没有重复条目。也许您的类项目中的size或length方法已被覆盖。我试过find_

  7. ruby - rails 3.0.7 内存泄漏 - 2

    我的两个不同的Rails应用程序的内存有一些奇怪的问题。这两个应用程序都使用rails3.0.7。每个Controller请求分配20-30-50MB的内存。在生产模式下,这个数量减少到5-10。但这是同样的事情。这是两个应用程序使用的gem列表:gem'pg'gem'haml'gem'sass'gem'devise'gem'simple_form'gem'state_machine'gem"globalize3","0.1.0.beta"gem"easy_globalize3_accessors"gem'paperclip'gem'andand'关闭所有这些gem不会给我任何结果。我

  8. ruby - 如何强制 Ruby 释放内存给操作系统 - 2

    正如标题,我有一个处理大量数据的ruby​​程序。该程序占用了所有内存,其中调用了系统命令hostname,并且发生错误无法分配内存-主机名我试过GC.start但它不起作用。那么如何强制ruby释放未使用的内存呢?OK,这是别人的测试代码,最后报错是big_var被回收了。但是内存仍然没有释放。require"weakref"defreportputs"#{param}:\t\tMemory"+`psax-opid,rss|grep-E"^[[:space:]]*#{$$}"`.strip.split.map(&:to_i)[1].to_s+'KB'endbig_var=""#big

  9. ruby - 如何在 Ruby 中从内存中 HTTP 发布流数据? - 2

    我想上传我在运行时用Ruby生成的数据,就像从block中提供上传数据一样。我找到的所有示例仅展示了如何流式传输必须在请求之前位于磁盘上的文件,但我不想缓冲该文件。除了滚动我自己的套接字连接之外,最好的解决方案是什么?这是一个伪代码示例:post_stream('127.0.0.1','/stream/')do|body|generate_xmldo|segment|body 最佳答案 有效的代码。require'thread'require'net/http'require'base64'require'openssl'class

  10. ruby-on-rails - 如何仅修改内存中的 zip 文件? - 2

    我有一个Ruby应用程序,我需要修改现有的zip文件。我想在内存中构建zip文件并流回字节,而无需将文件写入文件系统。如果我最终在Heroku上托管它,我认为我无法写入文件系统。有谁知道这样做的方法吗?我看了Zip::ZipFile但看起来它总是想写入文件系统。我想“基于java实现”我将能够只获取压缩文件的字节,这可以在java中完成,但我看不到这样做的方法。编辑:我要问的与此基本相同,但针对Ruby而不是Python:Functiontocreatein-memoryzipfileandreturnashttpresponse 最佳答案

随机推荐