我发现使用int
进行Java反序列化时,有大量ObjectInputStream
个数组实例。我知道这是由于创建了依赖关系跟踪对象(java.io.ObjectInputStream$HandleTable$HandleList)
。据我所知,它们用于在读取对象时将ClassNotFoundException传播到“依赖”对象。
我无法理解是否需要跟踪ClassNotFoundException
对目标对象的依赖性?如果找到ClassNotFoundException
,为什么实现不能立即抛出异常?
在我工作的一个Java应用程序中,反序列化过程中的瞬态内存使用有很大的问题。在使用jmap进行直方图后,我已经能够将峰值归因于int[]
个实例。
我正在尝试确定在遇到ClassNotFoundException
时终止反序列化过程是否正常。在这种情况下,我想更改ObjectInputStream并在bootstrap类路径中使用修改后的类。
我确实知道HandleTable的“条目”绝对需要将以前读取的任何对象连接到稍后从流中读取的依赖对象。只是为了澄清,问题一直是java.io.ObjectInputStream$HandleTable$HandleList
的重要性,我无法理解。
非常感谢任何见解。
谢谢,
拉加。
答案 0 :(得分:1)
它跟踪对象以解析循环引用,并确保在序列化之前指向同一对象C 的两个对象A和B不指向C 之后的两个单独实例反序列化。 没有跟踪引用,当反序列化A的对象层次结构时,它将创建一个C的实例,然后在反序列化B对象层次结构时,它将创建另一个单独的C实例。它与之几乎没有关系。 ClassNotFoundException的。
您可以做的最好的事情就是在完成一个"图表"的反序列化后立即丢弃ObjectInputStreams。对象,而不是重复使用它。