Android 应用程序永远将 Web 内容下载为字符串(WaitForGcToComplete 因 xx.xxxms 因 HeapTrim 而被阻止?)
Android app taking forever to download web content as string (WaitForGcToComplete blocked for xx.xxxms for cause HeapTrim?)
我是 Android 开发的新手,我正在尝试制作一个应用程序,它只需将给定网页的源代码下载为字符串并将其显示在日志中。我让它工作,并且对于 google.com,它工作得相当快。然而,对于我想要的网页,它需要八分钟,即使我的计算机的网络浏览器可以在几秒钟内加载它。在这 8 分钟内,日志中反复显示了 4 条消息,其值各不相同。他们是:
- W/art:挂起所有线程花费了:x.xxxm
- I/art:后台 stcky 并发标记扫描 GC 释放了 xx(xxxxB) 个 AllocSpace 对象...
- I/art:后台部分并发标记清除 GC 释放了 xx(xxxxB) 个 AllocSpace 对象...
- I/art:由于 HeapTrip
,WaitForGcToComplete 被阻塞了 xx.xxxms
谁能解释一下这是怎么回事,我怎样才能让这些内容的下载速度显着加快?这是某种记忆问题吗?我需要使用某种 BufferedReader 吗?
日志消息:
代码:
终于想通了。问题是 String 是一个不可变的 class,这意味着垃圾收集器需要清除在从 Java 的堆内存中读取下载内容时创建的每个 String,这将永远持续下去。
解决方法是在 doInBackground 方法的第一行创建一个新的 StringBuilder(),在整个方法中使用该 StringBuilder 代替 String,然后在最后,将 StringBuilder 转换为 String (StringBuilder.toString()).
我是 Android 开发的新手,我正在尝试制作一个应用程序,它只需将给定网页的源代码下载为字符串并将其显示在日志中。我让它工作,并且对于 google.com,它工作得相当快。然而,对于我想要的网页,它需要八分钟,即使我的计算机的网络浏览器可以在几秒钟内加载它。在这 8 分钟内,日志中反复显示了 4 条消息,其值各不相同。他们是:
- W/art:挂起所有线程花费了:x.xxxm
- I/art:后台 stcky 并发标记扫描 GC 释放了 xx(xxxxB) 个 AllocSpace 对象...
- I/art:后台部分并发标记清除 GC 释放了 xx(xxxxB) 个 AllocSpace 对象...
- I/art:由于 HeapTrip ,WaitForGcToComplete 被阻塞了 xx.xxxms
谁能解释一下这是怎么回事,我怎样才能让这些内容的下载速度显着加快?这是某种记忆问题吗?我需要使用某种 BufferedReader 吗?
日志消息:
代码:
终于想通了。问题是 String 是一个不可变的 class,这意味着垃圾收集器需要清除在从 Java 的堆内存中读取下载内容时创建的每个 String,这将永远持续下去。
解决方法是在 doInBackground 方法的第一行创建一个新的 StringBuilder(),在整个方法中使用该 StringBuilder 代替 String,然后在最后,将 StringBuilder 转换为 String (StringBuilder.toString()).