我 在 一 个 java 应用 程序 上 工作 , 它 需要 在 内存 中 保存~50k 的 json 对象 。
每个 json 字符 串 的 长度 约 为 5000 个 字符 。
额外 的 内存 消耗 是 我 关心 的 , 我 想 稍后 比较 json 对象 , 但 处理 不 是 我 关心 的 , 只是 额外 的 内存 消耗 。
更 高效 的 做法 是 :
- 将 json 保留 为 java 字符 串
- 将 json 保留 为 Jackson
JsonNode
对象
我 尝试 序列 化 JsonNode 对象 , 结果 文件 比 字符 串 大小 要 小 - 但 我 不 确定 内存 中 是否 也 是 如此 。
- 我 的 使用 案例 : * *
我 需要 检测 一些 对象 的 变化 , 这些 对象 被 编码 为 json , 这个 变化 检测 每 分钟 运行 一 次 , 并 将 当前 状态 与 上 一 次 状态 ( 我们 保存 在 内存 中 ) 进行 比较 。
没有 钩子 或 事件 或 类似 的 东西 来 获取 更改 。
我们 已经 在 内存 中 保存 了 这些 对象 的 列表 - - 其中 只 有 json 字段 的 有限 子集 。
我 无法 改变 架构 。
现在 , 我们 不再 把 json 数据 Map 到 Pojo , 然后 手动 比较 每个 属性 , 而是 先 保存 json 字符 串/对象 , 然后 用 某 个 库 计算 diff/patch 。 这 大大 简化 了 逻辑 , 也 更加 通用 - - 但是 我们 担心 额外 的 内存 消耗 。
1条答案
按热度按时间noj0wjuj1#
您可以使用java.lang.instrument包的getObjectSize()方法,通过这两种方法获得对象大小的近似值。
在javadoc中:
返回特定于实现的指定对象所占用的存储量的近似值。结果可能包括对象的部分或全部开销,因此对于在实现内进行比较(而不是在实现之间进行比较)很有用。在JVM的单个调用过程中,估计值可能会更改。