避免 enlargeBuffer 的工具方法

背景

ES 加入新文件提醒功能模块废弃了使用 mediastore 来查找所有文件,而是基于 android 底层的文件系统自己实现了一套全盘扫描监控文件的方案。

这种方案可以更方便的处理和监控文件的变化,但由于涉及到全盘扫描,对于数据量庞大的文件来说,内存占用是很大的一个挑战。

android 的内存碎片和 OutOfMemoryError

OutOfMemoryError 不一定是内存不足!!!

ES 的文件扫描方案分配和使用了大量的对象,由于5.0以前的系统(dalvik 虚拟机)的内存回收算法会造成大量的内存碎片,经过一段时间的运行后出现内存不足的 Error。(android GC 见末尾的文章参考)

StringBuilderHelper 减少碎片产生

在做内存优化的时候用到了一个小功能函数解决一个大问题。

/** 
 * 重复利用 StringBuild 的内存区域,减少 enlargeBuffer 造成的内存碎片  
 */
public class StringBuilderHelper {
    private static final ThreadLocal<StringBuilder> threadLocalStringBuilder = new ThreadLocal<StringBuilder>() {
        @Override
        protected StringBuilder initialValue() {
            return new StringBuilder(256);
        }
    };

    public static StringBuilder getThreadLocalStringBuilder() {
        StringBuilder sb = threadLocalStringBuilder.get();
        sb.setLength(0);
        return sb;
    }

}

将所有 StringBuilder sb = ew StringBuilder(); 替换成
StringBuilder sb = StringBuilderHelper.getThreadLocalStringBuilder(); 和 StringBuilder 一样使用即可。

在一台没有太多文件的手机上对比,StringBuilderHelper 减少了 300K 的内存占用。

参考

原文地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,004评论 25 708
  • afinalAfinal是一个android的ioc,orm框架 https://github.com/yangf...
    passiontim阅读 15,489评论 2 45
  • 本周的事对我来讲是一些比较有意思的体验,不过得从上周讲起。 上周我换了个发型,其实不是一时兴起,而是早有预谋的,大...
    漂无定所阅读 379评论 0 0
  • 以前糊涂或者装傻是因为不想去明白这些样或那些样的事物和人际关系,只想在自己的小世界里面轻松自在。现在是应该开始清醒...
    鱼儿飞飞_阅读 181评论 0 0
  • 最近一直有一种感觉困扰着我,不知道是否还有人有这种感觉,那就是一种东西明明是你的,并且已经属于你了好长时间,可是你...
    洛蓝阅读 402评论 1 1