Fastjson1 性能优化指南

Fastjson 是阿里巴巴开源的 JSON 处理库,凭借其卓越的性能和丰富的 API 深受 Java 开发者喜爱。对于初学者来说,掌握 Fastjson 的优化技巧不仅能提升应用响应速度,还能减少内存消耗。本文将带你逐步了解如何通过正确使用 Fastjson 1.x 来优化性能。

为什么需要性能优化?

在高并发场景下,JSON 序列化与反序列化可能成为系统瓶颈。不合理的配置或使用方式会导致 CPU 飙升、内存溢出等问题。优化后,同样的 JSON 操作速度可提升数倍。

核心优化技巧

1. 配置复用

复用 SerializeConfig 和 SerializerFeature

每次创建 SerializeConfig 对象会消耗资源,建议将其声明为静态常量:

private static final SerializeConfig CONFIG = new SerializeConfig();
private static final SerializerFeature[] FEATURES = {
    SerializerFeature.DisableCircularReferenceDetect,
    SerializerFeature.WriteMapNullValue
};

使用时直接引用:

String json = JSON.toJSONString(object, CONFIG, FEATURES);

2. 启用循环引用检测的禁用

Fastjson 默认会检测循环引用,这在无循环依赖的对象中属于无用开销。禁用后性能提升明显:

// 方式一:全局禁用
SerializerFeature.DisableCircularReferenceDetect

// 方式二:单个对象禁用
JSON.toJSONString(obj, SerializerFeature.DisableCircularReferenceDetect);

3. 预定义类型信息

反序列化时提前指定类型,避免 Fastjson 自动推断类型带来性能损失:

// 不推荐:需要类型推断
User user = JSON.parseObject(json, User.class);

// 推荐:显式指定类型(性能更优)
Type type = new TypeReference<List<User>>(){}.getType();
List<User> list = JSON.parseObject(json, type);

4. 使用 Feature 快速配置

Feature 类提供多个优化选项,典型优化组合:

// 启用自动关闭流、禁止特殊字符转义
String json = JSON.toJSONString(obj, 
    SerializerFeature.DisableCircularReferenceDetect,
    SerializerFeature.WriteNonStringValueAsString
);

5. 批量操作优化

处理大量 JSON 数据时,避免频繁创建对象,使用 JSONArrayJSONObject 直接操作:

// 高效:直接操作 JSONObject
JSONObject obj = JSON.parseObject(jsonStr);
String name = obj.getString("name");

// 不推荐:反复序列化
User user = JSON.parseObject(jsonStr, User.class);
String name = user.getName();

性能对比示例

以下测试代码展示优化前后的差异:

public class PerformanceTest {
    public static void main(String[] args) {
        // 准备测试数据
        List<User> users = new ArrayList<>();
        for (int i = 0; i < 10000; i++) {
            users.add(new User("user" + i, i));
        }

        // 优化前
        long start = System.currentTimeMillis();
        for (int i = 0; i < 100; i++) {
            String json = JSON.toJSONString(users);
        }
        System.out.println("优化前耗时:" + (System.currentTimeMillis() - start) + "ms");

        // 优化后
        start = System.currentTimeMillis();
        SerializeConfig config = new SerializeConfig();
        config.setAsmEnable(true);  // 启用 ASM
        for (int i = 0; i < 100; i++) {
            String json = JSON.toJSONString(users, config, 
                SerializerFeature.DisableCircularReferenceDetect);
        }
        System.out.println("优化后耗时:" + (System.currentTimeMillis() - start) + "ms");
    }
}

典型输出结果(运行环境不同会有差异):

优化前耗时:194ms
优化后耗时:81ms

性能提升约 2-3 倍。

实战建议

  1. 缓存结果:对于频繁返回的相同 JSON 结果,使用缓存(如 ConcurrentHashMap)避免重复序列化。
  2. 预编译 JSON:使用 JSON.toJSONString(object, config) 替代 JSON.toJSONString(object),减少反射调用。
  3. 监控与调优:结合 JProfiler 等工具分析实际场景中的热点,针对性优化。

总结

Fastjson 性能优化并非高深技术,通过合理复用配置、禁用非必要特性、精确指定类型等简单操作,即可实现显著性能提升。建议在项目初期就引入这些优化习惯,避免后期大规模重构。