我希望我不会在Java中发现一个错误!我正在运行JDK 7u11(主要是因为这是我的雇主允许的批准JVM),我注意到一个非常奇怪的问题。WriteObject没有正确写入Set?
也就是说,我分块数据为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
不应该表现出这种行为。
您的'Coordinate'类是否实现了['Serializable'](http://docs.oracle.com/javase/8/docs/api/java/io/Serializable.html)? – Powerlord 2015-04-02 19:57:59
是的,它'类坐标实现可序列化{' – 2015-04-02 19:58:23
请显示[最小完整示例](http://stackoverflow.com/help/mcve)重现。否则,我们基本上是猜测。 – Radiodef 2015-04-02 19:58:33