吞吐量(QPS)比单次耗时更贴近真实场景,需用统一基准测试序列化/反序列化性能:定义典型业务对象、预加载10万实例、固定JVM参数与关闭干扰项;Java原生、Protobuf、Kryo、Jackson四框架对比显示,Protobuf在10KB订单对象、10万QPS下达18.5万ops/s,CPU低35%。

直接用压测工具跑固定数据量下的单位时间操作次数,比单纯看单次耗时更贴近真实场景。吞吐量(QPS)反映的是系统在持续负载下的处理能力,尤其对高并发服务如订单、风控等关键链路至关重要。
准备统一测试基准
避免因数据结构差异导致结果失真。建议:
- 定义一个含嵌套集合、继承关系、泛型字段的典型业务对象(如Order包含User、List<Item>、Map<String, Object>)
- 预生成 10 万条该对象实例,全部加载进内存,不重复创建对象实例影响GC干扰
- 确保各框架使用相同 JVM 参数(如 -Xms2g -Xmx2g -XX:+UseG1GC),关闭 JMX 和监控代理
- 禁用日志输出(如 slf4j 绑定 nop),防止 I/O 成为瓶颈
控制变量测序列化吞吐量
重点测量每秒能完成多少次「对象 → 字节流」转换:
- Java 原生:用 ObjectOutputStream 写入 ByteArrayOutputStream,每次复用同一 ObjectOutputStream 实例(避免重复写头部元数据)
- Protobuf:基于 .proto 编译后的 Builder 构建,调用 build().toByteArray()
- Kryo:注册所有类,启用 setRegistrationRequired(true),复用 Kryo 和 Output 实例
- Jackson:复用 ObjectMapper 和 ByteArrayOutputStream,禁用 WRITE_DATES_AS_TIMESTAMPS 等非必要特性
运行 60 秒热身 + 300 秒正式采集,取稳定期每秒完成次数的平均值与 P99 值。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
立即学习“Java免费学习笔记(深入)”;
反序列化吞吐量要模拟真实调用链
不能只测“字节流 → 对象”,需包含网络或缓存环节的典型开销:
- 原生:从 ByteArrayInputStream 创建 ObjectInputStream,注意跳过 classloader 查找开销(可预设 ObjectInputStream 子类重写 resolveClass)
- Protobuf:用 parseFrom(byte[]),不走流式解析
- 对比项加一项「带网络模拟」:用 Netty 或 OkHttp 模拟 HTTP body 传输,再反序列化 —— 此时 JSON 与 Protobuf 差距会进一步拉大
- 记录 GC 次数与 pause 时间(用 -XX:+PrintGCDetails),Kryo 和 Protobuf 通常分配更少临时对象
关键指标不止 QPS,还要看资源效率
吞吐量高但吃光 CPU 或内存,线上不可行:
- 用 JFR(Java Flight Recorder) 录制 5 分钟压测过程,分析「Allocation Rate」和「Method Profiling」热点
- 对比各框架在相同 QPS 下的 CPU 占用率(top -H 或 pidstat -t)
- 检查堆外内存:Protobuf 和 Kryo 默认不使用堆外,而某些 Netty+Jackson 配置可能触发 ByteBuffer.allocateDirect
- 实测案例显示:10KB 订单对象在 10 万 QPS 下,Jackson 吞吐约 7.2 万 ops/s,Protobuf 达 18.5 万 ops/s,CPU 使用率低 35%


















