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

Abe*_*ehr 6 java kryo kryonet apache-spark

我有一个类似图形的对象,我从服务器发送到包含nodes它的客户端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));
Run Code Online (Sandbox Code Playgroud)

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

Exception in thread "Server" java.lang.StackOverflowError
at com.esotericsoftware.kryo.Kryo.getRegistration(Kryo.java:448)
at com.esotericsoftware.kryo.util.DefaultClassResolver.writeClass(DefaultClassResolver.java:79)
    ......
Run Code Online (Sandbox Code Playgroud)

在Kryonet有解决方法吗?谢谢

Ram*_*ram 1

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


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

修复
1) 尝试通过此处的
尾递归示例来修复此问题 2) 通过Xss在 vm 选项中指定来增加堆栈大小

-Xss1m(或根据您的要求增加)按照开发 Kryo 的 Esoteric 软件文档的建议

非常大的对象图:

堆栈大小

Kryo 提供的序列化程序在序列化嵌套对象时使用调用堆栈。Kryo 确实最大限度地减少了堆栈调用,但对于极深的对象图,可能会发生堆栈溢出。这是大多数序列化库(包括内置 Java 序列化)的常见问题。可以使用 -Xss 增加堆栈大小,但请注意,这适用于所有线程。具有许多线程的 JVM 中的大堆栈可能会使用大量内存。

apache Spark + Kryo 用户的 Imp 注意事项:

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