小编Rya*_*yan的帖子

在没有StackOverflowError的情况下序列化Java对象

我有一个非常大的Java对象,它在内存中表示带有顶点和边的图形.每个顶点都有一个ArrayList与其连接的其他顶点(并且还有一个HashMap数据结构用于其他目的).图形可以有几千个顶点,还有更多边.

当尝试使用Java的内置序列化(implements Serializable等等)来序列化图形时,我总是遇到一个StackOverflowError.设置图表的其他属性transient没有帮助,也没有将堆栈大小设置得更大(即-Xss1g-Xss512m).

我不认为我需要创建一个自定义writeObject方法,因为ArrayListHashMap已经拥有自己的实现,这些实现在序列化时调用.

我的问题是:有没有办法在没有得到的情况下序列化已经在内存中的大型Java对象StackOverflowError

编辑:这是堆栈跟踪:

Exception in thread "main" java.lang.StackOverflowError
at java.lang.reflect.Method.invoke(Method.java:575)
at java.io.ObjectStreamClass.invokeWriteObject(ObjectStreamClass.java:950)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1482)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1413)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1159)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1535)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1413)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1159)
at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:329)
at java.util.ArrayList.writeObject(ArrayList.java:570)
at sun.reflect.GeneratedMethodAccessor1.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:950)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1482)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1413)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1159)
at java.io.ObjectOutputStream.defaultWriteFields(ObjectOutputStream.java:1535)
at java.io.ObjectOutputStream.writeSerialData(ObjectOutputStream.java:1496)
at java.io.ObjectOutputStream.writeOrdinaryObject(ObjectOutputStream.java:1413)
at java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.java:1159)
at …
Run Code Online (Sandbox Code Playgroud)

java stack-overflow serialization

8
推荐指数
1
解决办法
3114
查看次数

为什么`++ a ++`不是用C++编译而是`(++ a)++`呢?

标题说的是什么.对于C++,(++a)++编译.但奇怪的是,++(a++)不是:

int main() {
    int a = 0;
    ++a++; // does not compile
    (++a)++; // does compile
    ++(a++); // does not compile
}
Run Code Online (Sandbox Code Playgroud)

但在Java中,并不是所有三个:

public class Test {
    public static void main(String[] args) {
        int a = 0;
        ++a++; // does not compile
        (++a)++; // does not compile
        ++(a++); // does not compile
    }
}
Run Code Online (Sandbox Code Playgroud)

有没有理由为什么C++编译它而不是Java?

c++ java rvalue lvalue

6
推荐指数
1
解决办法
641
查看次数

在Java中启用Intel超线程

我有一个在四核Intel i7上运行的多线程程序.当我执行时Runtime.getRuntime.availableProcessors(),我得到8,我知道在这个CPU上可以使用超线程.

但是,当我创建线程时,我的CPU级别为4个线程的100%(即非零),这意味着4个线程未被使用.有没有办法在Java中启用超线程?

java multithreading hyperthreading

5
推荐指数
1
解决办法
5833
查看次数

为什么在String.java中检查另一个对象的相等性?

在String.java中,此代码位于.equals()方法的开头:

public boolean equals(Object anObject) {
    if (this == anObject) {
        return true;
    }
    // ... check if instance of String, etc.
}
Run Code Online (Sandbox Code Playgroud)

这个检查纯粹是出于性能原因(即不包括它会检查this自身的字符)?

java string

2
推荐指数
1
解决办法
86
查看次数

为什么public void Void(){...}在Java中编译?

我有这个代码:

public class Test {
    public static void main(String[] args) {
        Void();
    }

    private static void Void() {
        System.out.print("Hello");
    }
}
Run Code Online (Sandbox Code Playgroud)

既然java.lang.Void是Java中的一个类,为什么它可以作为方法名?

java void

1
推荐指数
1
解决办法
207
查看次数

比较只有形式<=和> =(而不包括= <和=>)的原因是什么?

在许多语言,比如Java和C/C++,比较始终形式的完成<=>=.例如,这是一个工作示例程序:

import java.util.*;
public class Main{
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in);
        // Get inputs
        int input1 = s.nextInt();
        int input2 = s.nextInt();

        // compare them
        if (input1 >= input2) {
            System.out.println("Input 1 is greater than or equal to input 2");
        } else {
            System.out.println("Input 1 is less than input 2");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这会编译并正确运行.但是,如果我将一条比较线更改为:

import java.util.*;
public class Main{
    public static void main(String[] args) {
        Scanner s = new Scanner(System.in); …
Run Code Online (Sandbox Code Playgroud)

c++ java compiler-errors

0
推荐指数
1
解决办法
103
查看次数