具有网络作业分配的Java.lang.OutOfMemoryError

时间:2012-02-08 15:50:37

标签: java exception networking heap

我正在为我的一个大学课程编写网络作业,我遇到了一些问题。此分配包括设置一组节点,这些节点使用预定义的消息集通过套接字相互通信。这些消息必须能够从发回的字节数据和第四个套接字构造。

以下是处理来自byte []:

的数据的消息之一的方法示例
    public void processData(byte [] data) throws IOException 
{
    DataInputStream stream = new DataInputStream(new ByteArrayInputStream(data));
    //get the status code
    statusCode = (byte)stream.read();
    System.out.println("Status Code: "+statusCode);

    //get the additional info
    byte [] additionalInfoData = new byte[stream.readInt()];
    stream.read(additionalInfoData, 0, additionalInfoData.length);
    additionalInfo = new String(additionalInfoData);
    System.out.println("additionalInfo: "+statusCode);

    stream.close();

}

当我运行程序时,它到达这一点(这是在发送第一条消息之后),它停止了

    byte [] additionalInfoData = new byte[stream.readInt()];

有这个例外:

Exception in thread "Thread-1" java.lang.OutOfMemoryError: Java heap space at cdn.wireformats.RegisterResponse.processData(RegisterResponse.java:58) at cdn.wireformats.RegisterResponse.<init>(RegisterResponse.java:31) at cdn.wireformats.WireFormatFactory.getWireFormatMessage(WireFormatFactory.java:22) at cdn.communications.Link.readMessage(Link.java:62) at cdn.communications.Link.run(Link.java:98) at java.lang.Thread.run(Thread.java:679)

有谁知道如何解决这个问题?我是否错误地从字节[]中读取数据?

2 个答案:

答案 0 :(得分:2)

您可能从stream.readInt()获得的价值不是您所期望的。我建议打印出来并确保它是正确的。

可能存在endianness问题,或者可能是接收代码不是100%与发送代码一致。

答案 1 :(得分:0)

为什么不写

byte [] additionalInfoData = new byte[stream.readByte()];

关于内存管理的一些普遍考虑可能有用:默认堆空间大小为64 Mb。为了扩展它,你需要使用Xmx参数启动你的JVM。

java -Xmx512M