gpt4 book ai didi

java - WriteObject 没有正确写入 Set?

转载 作者:行者123 更新时间:2023-12-01 11:42:29 25 4
gpt4 key购买 nike

我希望我不只是发现 Java 中的错误!我正在运行 JDK 7u11(主要是因为这是我的雇主允许的认可的 JVM),并且我注意到一个非常奇怪的问题。

也就是说,我将数据分块到 LinkedHashSet并使用 ObjectOutputStream 将其写入文件雏菊通过GZIpOutputStream改变(提及这一点以防万一)。

现在,当我到达程序的另一边时 readObject()我注意到尺寸总是显示为 68,这是第一个尺寸。基础表的数量可以多于或少于 68,但 .size()方法总是返回 68。更麻烦的是,当我尝试手动迭代底层 Set 时,也停在 68。

while(...) {
oos.writeInt(p_rid);
oos.writeObject(wptSet);
wptSet.clear();
// wptSet = new LinkedHashSet<>(); // **This somehow causes the heapsize to increase dramatically, but it does solve the problem**
}

阅读时

Set<Coordinate> coordinates = (Set<Coordinate>) ois.readObject();

coordinates.size()总是返回 68。现在,我还可以通过 .writeInt() 来解决这个问题。大小,但我只能迭代 68 个成员!

注意 wptSet = new LinkedHashSet<>()线实际上解决了问题。主要问题是,在 JVisualVM 中查看程序时,它使我的堆大小猛增。

更新:实际上,我刚刚找到了一个可行的解决方法,可以修复重新实例化 wptSet 时的内存泄漏... System.gc()每次调用.clear()后调用它实际上可以避免内存泄漏。

无论哪种方式,我都不应该这样做并运送 LinkedHashSet不应该表现出这种行为。

最佳答案

好吧,我想我明白你在问什么了。

这是一个重现的示例...

import java.util.*;
import java.io.*;

class Example {
public static void main(String[] args) throws Exception {
Set<Object> theSet = new LinkedHashSet<>();
final int size = 3;

for(int i = 0; i < size; ++i) {
theSet.add(i);
}

ByteArrayOutputStream bytesOut = new ByteArrayOutputStream();
ObjectOutputStream objectsOut = new ObjectOutputStream(bytesOut);

for(int i = 0; i < size; ++i) {
objectsOut.writeObject(theSet);
theSet.remove(i); // mutate theSet for each write
}

ObjectInputStream objectsIn = new ObjectInputStream(
new ByteArrayInputStream(bytesOut.toByteArray()));

for(;;) {
try {
System.out.println(((Set<?>)objectsIn.readObject()).size());
} catch(EOFException e) {
break;
}
}
}
}

输出为

3
3
3

这里发生的事情是 ObjectOutputStream 检测到您每次都在写入相同的对象。每次写入theSet时,都会写入该对象的“共享引用”,以便每次都反序列化同一对象。 the documentation对此进行了解释。 :

Multiple references to a single object are encoded using a reference sharing mechanism so that graphs of objects can be restored to the same shape as when the original was written.

在这种情况下,您应该使用 writeUnshared(Object)这将绕过此机制,而不是 writeObject(Object)

关于java - WriteObject 没有正确写入 Set?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29421335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com