草庐IT

android - WebView 占用太多内存

coder 2023-12-08 原文

在我的应用中有两个 Activity,即 A 和 B。

Activity A:

它有一个列表,可以简要显示有关项目的信息。单击 A 上的项目时,它会加载 Activity B。

Activity B:

它有两个 WebView 和几个 ListView 。 Activity 的顶部被标题网页 View 占据。 Activity 的下半部分有选项卡宿主,它承载第一个选项卡中的第二个 Web View ,其余选项卡每个承载一个 ListView 。

问题:

当用户从 A 导航到 B 时,堆大小会显着增加。即使在我从 B 导航回 A 之后,堆大小仍然保持不变。甚至没有字节减少,实际上它有时会增加。是的,因为这些网络浏览量。我已经阅读了有关 SO 和其他站点的 Web View 内存泄漏的信息。我按照提到的方法 here

  1. 在容器 [RelativeLayout] 中动态添加 WebView 。删除了关于 Destroy Activity 的 webview
  2. 按照 SO 文章中的建议对 Web View 进行子分类
  3. 每次都清除 WebView 缓存等

无论堆大小如何,都不会回到导航到 B 之前的状态。

如果有人能指导我解决问题,我将不胜感激

注意:

我已经阅读了这篇文章并在 SO 上关注了这个问题。 Memory leak in WebView

编辑:

我在 B 中尝试过没有 web views 并且堆大小的增加非常非常少,大约 0.5 MB 但有 web views 它减少了 4-5 MB

堆大小日志(通过以下建议得到 here )

onCreate B
debug.heap native: allocated 4.11MB of 4.17MB (0.01MB free) in []    
debug.memory: allocated: 12.00MB of 96.00MB (1.00MB free)


onDestroy B
debug.heap native: allocated 8.66MB of 10.08MB (0.48MB free) in []    
debug.memory: allocated: 12.00MB of 96.00MB (1.00MB free)

on Resume A    
debug.heap native: allocated 7.94MB of 10.08MB (1.32MB free) in []
debug.memory: allocated: 12.00MB of 96.00MB (0.00MB free)

我通过在 B 启动和销毁之前和之后进行堆转储来交叉检查数字,堆大小非常接近我在日志中得到的大小

最佳答案

我遵循了一系列步骤并减少了内存占用。这就是我所做的, 我现在不再通过 xml 静态创建 webview,而是以编程方式创建 webview 并将其添加到容器中。一旦不再需要 webview,我从容器中删除 webview,然后我从 webview 中删除所有 View 并调用销毁它。最终分配的内存减少。

private void releaseWebView() {

    webViewContainerRelView.removeAllViews();
        if(mWebView != null){
            mWebView.setTag(null);          
            mWebView.clearHistory();
            mWebView.removeAllViews();          
            mWebView.clearView();
            mWebView.destroy();
            mWebView = null;
        }
}

我从 Activity 的 onDetachedFromWindow 方法调用 releaseWebView(),如下所示。

@Override
public void onDetachedFromWindow() {
    super.onDetachedFromWindow();
    releaseWebViews();
}

关于android - WebView 占用太多内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17741297/

有关android - WebView 占用太多内存的更多相关文章

  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 文件句柄管理(打开的文件太多) - 2

    我在ruby​​(2.0.0p39474)中执行非常快速的文件访问,并不断收到异常Toomanyopenfiles看过thisthread,here,以及各种其他来源,我很清楚操作系统限制(在我的系统上设置为1024)。我执行此文件访问的代码部分是互斥的,并采用以下形式:File.open(filename,'w'){|f|Marshal.dump(value,f)}其中filename会根据调用该部分的线程快速变化。据我了解,此表单在block后放弃其文件句柄。我可以使用ObjectSpace.each_object(File)验证打开的File对象的数量.这报告最多有100个常驻内

随机推荐