频繁new StringBuild() 可能造成内存泄漏

频繁new StringBuild() 可能造成内存泄漏

private static void log(@NonNull HiLogConfig config, @HiLogType.TYPE int type, @NonNull String tag, Object... contents) {
    if (!config.enable()) {
        return;
    }
    StringBuilder sb = new StringBuilder();
    String body = parseBody(contents, null);
    sb.append(body);
    Log.println(type, tag, body);
}

private static String parseBody(@NonNull Object[] contents, @NonNull HiLogConfig config) {
    StringBuilder sb = new StringBuilder();
    for (Object o : contents) {
        sb.append(o.toString()).append(";");
    }
    if (sb.length() > 0) {
        sb.deleteCharAt(sb.length() - 1);
    }
    return sb.toString();
}

从HiLog这个看到log()这个方法 new StringBuilder(),然后 parseBody 里面又 new StringBuilder(),我这里试着连续打印1W次HiLog.a(""),可以通过profiler明显看到内存和cpu占用非常高,那么对于一些需求场景,需要一直打印日志的,就很容易造成ANR或者内存泄漏的问题,老师们优化下这个问题憋


正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

1回答
CrazyCodeBoy 2020-06-02 10:11:56

你的1w次打印是是通过for循环一次创建的吗,对于这种高频的使用场景GC是没那么及时的,可以将对stringbuilder的使用设计成单例,减少频繁的创建。

  • 设计成单例的话会造成打印的log信息会一直叠加,比如第一次是9900,第二次就是99009900第三次就是9900990099009900,因为StringBuilder 是同一个,要怎么才能解决这种问题呢?
    2020-07-02 00:20:34
  • 每次打印完通过 sb.delete( 0, sb.length() );清除下数据。
    2020-07-02 09:19:41
  • 已改好,当时没想起来做这一步,谢谢老师。
    2020-07-02 12:12:16
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师