陈的有趣的帖子:
调试堆栈溢出时,您需要关注重复的递归部分
在您的情况下:
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150) at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1509) at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1474) at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1392) at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1150) at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:326) at java.util.ArrayList.writeObject(ArrayList.java:570) at sun.reflect.GeneratedMethodAccessor6.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:945) at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1461)
如果您遍历缺陷跟踪数据库以尝试查看这是否是已知问题,那么搜索堆栈中的顶级功能就不太可能找到有趣的东西。这是因为堆栈溢出通常在递归的随机点发生;即使每个堆栈溢出都是相同的堆栈溢出,它们在表面上看起来也彼此不同。
一旦克服了最初的动荡,堆栈跟踪就会稳定下来,形成一个很好的重复模式,该重复模式由相同的x函数一遍又一遍组成。
识别重复模式的开始并不重要,因为每次碰撞的起点都会有所不同,就像超出每次演唱范围的精确音符会因碰撞而有所不同一样。一旦确定了重复部分,请从中选择一个与众不同的功能,然后在缺陷数据库中进行搜索。
例如,默认
ArrayList序列化。
在这里,您
GrahPanel指的
Simulation是指的
Graph,可能具有较长
ArrayList的Sensor和Edge
…
Java序列化记录每个写入流的对象的记录。如果第二次遇到相同的对象,则仅将对它的引用写入流中,而不是该对象的第二个副本;因此循环引用不是这里的问题。
但是,对于某些类型的结构,序列化容易受到堆栈溢出的影响。例如, 将通过递归写入每个链接来序列化没有特殊writeObject()方法的长链接列表。
如果您有100,000个链接,则将尝试使用100,000个堆栈帧,并且很可能因StackOverflowError而失败。可以为这样的列表类定义一个writeObject()方法:当第一个链接被序列化时,只需遍历该列表并迭代地序列化每个链接即可;这将阻止使用默认的递归机制。



