6

我有一个类似图形的对象,我从服务器发送到客户端,其中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));

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

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)
    ......

在 Kryonet 中有解决方法吗?谢谢

4

1 回答 1

2

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


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

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

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

非常大的对象图:

堆栈大小

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

apache spark + Kryo 用户的 Imp 注意:

在火花的情况下,我 spark.executor.extraJavaOptions=...以编程方式设置 SparkConf 对象(以及 -Xmx -XX 选项),或者您也可以在spark-default.conf

于 2017-12-20T19:11:47.460 回答