【问题标题】:Android app taking forever to download web content as string (WaitForGcToComplete blocked for xx.xxxms for cause HeapTrim?)Android 应用程序需要永远以字符串形式下载 Web 内容(WaitForGcToComplete 因 xx.xxxms 而被阻止,原因是 HeapTrim?)
【发布时间】:2016-03-10 17:05:59
【问题描述】:

我是 Android 开发的新手,我正在尝试制作一个应用程序,该应用程序只需将给定网页的源代码下载为字符串并将其显示在日志中。我有它的工作,对于 google.com,它工作得相当快。然而,对于我想要的网页,它需要八分钟,即使我的计算机的网络浏览器可以在几秒钟内加载它。在这八分钟内,日志中一遍又一遍地显示四条消息,其值各不相同。它们是:

  • W/art:暂停所有线程占用:x.xxxm
  • I/art:后台 stcky 并发标记扫描 GC 释放 xx(xxxxB) AllocSpace 对象...
  • I/art:后台部分并发标记扫描 GC 释放 xx(xxxxB) AllocSpace 对象...
  • I/art:WaitForGcToComplete 因 HeapTrip 原因阻塞 xx.xxxms

有人能解释一下发生了什么,以及如何让这些内容的下载速度显着加快吗?这是某种内存问题吗?我需要使用某种 BufferedReader 吗?

日志消息:

代码:

【问题讨论】:

    标签: java android garbage-collection bufferedreader download


    【解决方案1】:

    终于想通了。问题是 String 是一个不可变的类,这意味着垃圾收集器需要清除从 Java 堆内存中读取下载内容时创建的每个 String,这需要很长时间。

    修复方法是在 doInBackground 方法的第一行创建一个新的 StringBuilder(),在整个方法中使用该 StringBuilder 代替 String,然后在最后将 StringBuilder 转换为 String (StringBuilder.toString ())。

    【讨论】:

    • 另外,不是一个一个地读取字符,而是使用重载方法来读取 char 数组。这将大大减少方法调用开销。
    猜你喜欢
    • 1970-01-01
    • 2021-09-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    相关资源
    最近更新 更多