java.lang.StackOverflowError使用Kryo序列化彼此引用的对象时

时间:2015-02-21 00:28:39

标签: java apache-spark kryo kryonet

我有一个类似图形的对象,我从服务器发送到包含nodes的{​​{1}}的客户端。

我有类似的东西:

adjacencyLists

每次发送包含这些清除的对象时,都会收到以下错误:

Clearing c1 = new Clearing(1, 134, 151);
Clearing c6 = new Clearing(6, 250, 88);

c1.adjacentByPath.add(new Path(1, c6));
c6.adjacentByPath.add(new Path(1, c1));

Kryonet有解决方法吗?感谢

1 个答案:

答案 0 :(得分:2)

这是迟到的答案,但最近我遇到了这个并且能够复制和修复。

每当在kryo序列化中使用大对象图时就会发生这种情况......

  

修复
   1)尝试通过尾递归示例here来解决这个问题    2)通过在vm选项中指定for (...) { View view = inflate(..) // inflate new view layout.addView(view); // add new view }

来增加堆栈大小
根据{{​​3}}

的建议,

Xss(或根据您的要求增加)

非常大的对象图:

  

堆叠尺寸

     

序列化程序Kryo在序列化时使用调用堆栈   嵌套对象。 Kryo确实最小化了堆栈调用,但是非常深   对象图,可能发生堆栈溢出。这是一个常见的问题   大多数序列化库,包括内置的Java   序列化。使用-Xss可以增加堆栈大小,但请注意   这适用于所有线程。 JVM中的大堆栈大小有很多   线程可能会占用大量内存。

Imp注意apache spark + Kryo用户:

  

如果是spark,我设置了SparkConf对象   -Xss1m(以及-Xmx -XX选项)   以编程方式或您也可以在spark.executor.extraJavaOptions=...

中提及