【问题标题】:Is Java serialization a tool to shrink the memory footprint?Java 序列化是缩小内存占用的工具吗?
【发布时间】:2010-05-27 08:03:11
【问题描述】:

Java 中的序列化是否总是必须缩小用于保存对象结构的内存?还是可能序列化会产生更高的成本?

换句话说: 序列化是缩小 Java 中对象结构的内存占用的工具吗?


编辑
我完全知道序列化的目的是什么。但你知道,工具可能会被滥用。我的问题是,它是否是减少内存使用的好工具。

那么您能想象出什么原因,为什么内存使用量应该增加/减少? 在大多数情况下会发生什么?

【问题讨论】:

  • 当你说“缩小”时,你的意思是“增长”/“增加”吗?
  • 无论哪种方式 :-) 我不确定内存使用量是增加还是减少。这就是为什么我想留下这个问题。
  • 你考虑过测试这个吗?
  • 其实我目前正在分析这样一个应用程序;-) 对象结构庞大而复杂。序列化实际上似乎从根本上减少了分配的内存。
  • 听上去好像你自己回答了你的问题。

标签: java performance memory serialization


【解决方案1】:

不...序列化是一种将对象状态表示为字节数组的方式写入或读取。它不是一种替代的内存表示。一个对象的序列化形式可能会也可能不会比它在 JVM 中消耗更多的字节;通常它是相当可比的。在极少数情况下,它可能更多,有时对象的状态可以完全序列化,其消耗的字节数比在堆上消耗的字节数少。但不回答这个问题,它不是“缩小内存占用的工具”。

【讨论】:

    【解决方案2】:

    我的问题是,它是否是减少内存使用的好工具。

    不,这不是一个很好的工具。序列化的对象表示包括许多描述对象类型和表示的“元数据”。除非您将大量对象序列化为一个“流”,否则“元数据”开销将使序列化形式大于原始形式。忽略这个开销,序列化的表示通常更紧凑,但节省在很大程度上取决于对象的表示类型。 (查看"Object Serialization Stream Protocol"了解更多详情。)

    正如其他答案所提到的,您在序列化和反序列化时会暂时增加内存使用量,因为您必须同时保存串行和对象表示以及用于处理循环等的映射。

    如果您想在内存中以紧凑的形式表示数据结构,最好开发自己的特定于应用程序的序列化方案。但是 IMO,最好还是将数据写入文件系统或数据库。

    【讨论】:

    • 确实可能与此问题平行的测试似乎表明,对象结构必须比某个阈值更大/更复杂。然后,内存减少可以抵消相对较大的元数据开销。因此,我选择这个答案是正确的。谢谢。
    【解决方案3】:

    它可以减少内存占用的唯一方法是使用瞬态字段序列化一些对象,转储原始对象并反序列化 - 这样您会丢失瞬态字段中的对象。

    【讨论】:

      【解决方案4】:

      使用对象序列化,所有(非瞬态)字段的值和一些额外的管理数据都被写入缓冲区(流)。通常的意图是将此缓冲区写入文件或套接字。序列化的对象不受影响。

      所以实际上反之亦然:序列化(暂时)增加了内存占用,因为对象的序列化表示也将驻留在内存中。

      【讨论】:

        【解决方案5】:

        无论如何,序列化并不关心缩小内存占用,它基本上是将对象的状态保存为字节序列,并在未来某个时间将这些字节重建为活动对象的过程。 主要用于存储对象的状态,以便在虚拟机的生命周期之外使用,对象可以在需要的时间和地点进行重构和使用。

        【讨论】:

        • 我认为关键是通过写入文件系统来缩小内存需求。他并不是说序列化会自动节省内存。
        【解决方案6】:

        我说 MAY BE YES(如果收缩 == 增长/增加),因为序列化在处理过程中保留了对象在内存中的表示。

        如果您想停止这种情况,您需要在 ObjectOutputStream 上调用 close 或 reset。

        如果调用new ObjectOutputStream / close,关闭后不会占用内存。

        【讨论】:

          猜你喜欢
          • 2011-03-17
          • 2012-06-22
          • 1970-01-01
          • 2011-11-02
          • 1970-01-01
          • 2010-10-15
          • 1970-01-01
          • 2011-11-01
          • 1970-01-01
          相关资源
          最近更新 更多