Android 开发问题 —— 在处理字符串时,频繁调用 GC

发生情景

在使用 TCP 与服务器进行通信时,需要进行图片的传输,使用的是字节流的方式,并且需要对字节进行拼接。关键需要将拼接完成的消息进行密钥加密,加密方法的参数为字符串。而我也就使用了字符串的 ” + ” 形式进行拼接、加密及分包。

描述

在对软件进行调试时终端频繁调用 GC ,并且处理速度异常的慢。以下是日志内容:

04-23 11:22:00.370 2448-2463/com.beviswang.dttimer I/art: Background partial concurrent mark sweep GC freed 633(23KB) AllocSpace objects, 277(10MB) LOS objects, 39% free, 7MB/12MB, paused 1.351ms total 121.955ms
04-23 11:22:00.656 2448-2463/com.beviswang.dttimer I/art: Background partial concurrent mark sweep GC freed 389(13KB) AllocSpace objects, 225(9MB) LOS objects, 39% free, 8MB/13MB, paused 1.188ms total 125.609ms
04-23 11:22:00.994 2448-2463/com.beviswang.dttimer I/art: Background partial concurrent mark sweep GC freed 426(15KB) AllocSpace objects, 274(11MB) LOS objects, 40% free, 8MB/13MB, paused 5.150ms total 144.439ms
04-23 11:22:01.718 2448-2463/com.beviswang.dttimer I/art: Background partial concurrent mark sweep GC freed 505(17KB) AllocSpace objects, 328(13MB) LOS objects, 40% free, 8MB/13MB, paused 1.200ms total 148.203ms
04-23 11:22:02.044 2448-2463/com.beviswang.dttimer I/art: Background partial concurrent mark sweep GC freed 384(13KB) AllocSpace objects, 240(9MB) LOS objects, 40% free, 9MB/15MB, paused 5.214ms total 131.344ms
04-23 11:22:02.410 2448-2463/com.beviswang.dttimer I/art: Background partial concurrent mark sweep GC freed 461(16KB) AllocSpace objects, 300(12MB) LOS objects, 39% free, 8MB/14MB, paused 1.005ms total 150.486ms
04-23 11:22:02.746 2448-2463/com.beviswang.dttimer I/art: Background partial concurrent mark sweep GC freed 405(14KB) AllocSpace objects, 255(10MB) LOS objects, 40% free, 9MB/15MB, paused 5.015ms total 129.852ms
04-23 11:22:03.133 2448-2463/com.beviswang.dttimer I/art: Background partial concurrent mark sweep GC freed 441(15KB) AllocSpace objects, 283(12MB) LOS objects, 40% free, 8MB/13MB, paused 5.585ms total 156.783ms
04-23 11:22:03.457 2448-2463/com.beviswang.dttimer I/art: Background partial concurrent mark sweep GC freed 383(13KB) AllocSpace objects, 237(10MB) LOS objects, 39% free, 8MB/14MB, paused 2.303ms total 138.655ms
04-23 11:22:03.785 2448-2463/com.beviswang.dttimer I/art: Background partial concurrent mark sweep GC freed 402(14KB) AllocSpace objects, 244(11MB) LOS objects, 40% free, 8MB/13MB, paused 1.129ms total 124.835ms
04-23 11:22:04.120 2448-2463/com.beviswang.dttimer I/art: Background partial concurrent mark sweep GC freed 381(13KB) AllocSpace objects, 237(10MB) LOS objects, 39% free, 8MB/14MB, paused 5.454ms total 124.930ms
04-23 11:22:04.486 2448-2463/com.beviswang.dttimer I/art: Background partial concurrent mark sweep GC freed 427(15KB) AllocSpace objects, 263(11MB) LOS objects, 39% free, 8MB/13MB, paused 1.007ms total 145.510ms

原因

使用 “ + ” 拼接较长的字符串会严重影响性能。测试发现在性能较高的设备上使用 “ + ” 拼接一定量的字符的字符串时,不会发生频繁调用 GC ,但是在低性能的设备上使用该方式拼接则会导致拼接过程非常耗时,毕竟频繁调用了 GC 回收嘛。

解决方案

对于长度较长的字符串间的拼接需要使用 StringBuilder 进行拼接,append 在尾部拼接字符串,insert 在任意位置拼接字符串。

你可能感兴趣的:(Android)