java反序列化过程中的大量int数组

java反序列化过程中的大量int数组,java,deserialization,Java,Deserialization,我看到在使用ObjectInputStream进行Java反序列化期间,有大量int数组实例。我知道这是由于创建了依赖项跟踪对象(java.io.ObjectInputStream$HandleTable$HandleList)。据我所知,它们用于在读取对象时将ClassNotFoundException传播到“依赖”对象 我无法理解跟踪ClassNotFoundException对目标对象的依赖关系的需要?如果找到ClassNotFoundException,为什么实现不能立即抛出异常 在我工

我看到在使用
ObjectInputStream
进行Java反序列化期间,有大量
int
数组实例。我知道这是由于创建了依赖项跟踪对象
(java.io.ObjectInputStream$HandleTable$HandleList)
。据我所知,它们用于在读取对象时将ClassNotFoundException传播到“依赖”对象

我无法理解跟踪
ClassNotFoundException
对目标对象的依赖关系的需要?如果找到
ClassNotFoundException
,为什么实现不能立即抛出异常

在我工作的一个Java应用程序中,在反序列化过程中,瞬时内存使用量会有很大的波动。在使用jmap获取直方图之后,我能够将峰值归因于
int[]
实例

我正在尝试确定在遇到
ClassNotFoundException
时终止反序列化过程是否正常。在本例中,我希望更改ObjectInputStream并在引导类路径中使用修改过的类

我确实意识到,HandleTable的“条目”是将以前读取的任何对象关联到以后从流中读取的依赖对象所必需的。我只是想澄清一下,
java.io.ObjectInputStream$HandleTable$HandleList
的重要性,我没有理解

非常感谢您的任何见解

谢谢,

Raja.

它跟踪对象的目的是解析循环引用,并确保序列化之前指向同一对象C的两个对象A和B在反序列化之后不会指向C的两个单独实例。在没有跟踪引用的情况下,当A的对象层次结构被反序列化时,它将创建一个C的实例,然后在反序列化B对象层次结构时,它将创建另一个单独的C实例。它与ClassNotFoundException没有什么关系


您所能做的最好的事情就是在完成一个对象“图”的反序列化后立即丢弃ObjectInputStreams,而不是将其用于许多对象。

java.io.ObjectInputStream$HandleTable.entries中跟踪反向引用。
。是的,它们是你所说的所必需的。然而,我的问题是关于
java.io.ObjectInputStream$HandleTable.deps
,它是一个HandleList数组。查看
ObjectInputStream
的代码,这是用于ClassNotFoundException依赖项跟踪的<代码>条目数组应足以查找引用和连线,而此目的不需要
deps
。这不是真的吗?是的,看起来
deps
是为ClassNotFoundException传播而设计的。如果您100%确定所有类都将在反序列化时出现,并且希望消除此开销,请将
ObjectInputStream
源复制到您自己的
MyObjectInputStream
类中,并删除依赖项跟踪。即使在更改的代码中存在
ClassNotFoundException
,我想马上抛出并传播异常。因此,失败仍然很明显。很难看出在这种情况下如何消除临时对象的创建。HandleTable的代码注释说:“一旦注册了句柄的所有异常信息/依赖项,句柄应该“关闭”“通过对其调用finish方法。完成句柄的行为允许异常传播算法积极地修剪依赖关系链接,减少异常跟踪对性能/内存的影响。”看起来他们正在尽最大努力管理内存。但也许你可以想出一个更有效的模型。