Skip to content

背景

  • MQTT客户端每秒接收大量设备数据,单条消息约1m

cpu负载优化

  1. 移除额外的json序列化操作 mq客户端接收到的消息是json格式,需要进行第一次反序列化操作(假设反序列化为Device数组),用于后续业务操作, Device数组中的wave/args需要合并后 json string格式存储, 此处可以使用自定义的 Collectors, 降低字符串拼接带来的额外新生代内存消耗以及 json序列化带来的cpu消耗
        List<Device> list = ....
        String wave = list.stream().filter(a -> StringUtils.isNotEmpty(a.getWave()))
                .map(a -> String.format("\"%s\":%s", a.getType(), a.getWave()))
                .collect(toJsonFormat());
      private Collector<String, StringBuilder, String> toJsonFormat() {
         return Collector.of(
                 () -> new StringBuilder("{"),
                 (sb, s) -> {
                     if (sb.length() > 1) {
                         sb.append(",");
                     }
                     sb.append(s);
                 },
                 (sb1, sb2) -> {
                     if (sb1.length() > 1 && sb2.length() > 1) {
                         sb1.append(",");
                     }
                     sb1.append(sb2, 1, sb2.length() - 1);
                     return sb1;
                 },
                 sb -> sb.append("}").toString()
         );
     }

内存优化

Java中9种常见的CMS GC问题分析与解决

  1. 增加新生代内存大小,减少full gc发生的频率 -XX:NewSize -XX:MaxNewSize