2012-02-08 56 views
2

我目前正在为我的大学课程之一编写一个网络任务,我遇到了一些问题。此分配包括设置一组使用预定义消息在套接字上相互通信的节点。这些消息必须能够由发回的字节数据和第四个套接字构成。与网络作业分配的Java.lang.OutOfMemoryError

这里是消息中的一个的内部的方法,该方法从一个字节[]处理数据的一个示例:

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)

有没有人有任何想法如何解决这个问题?我是否正确读取了byte []的数据?

+0

流有多大,即stream.readInt()返回的是什么?你给JVM多少内存?您是否设置了最大内存或将其保留为默认值?哪个JVM - 热点,JRockit,...? – Thomas 2012-02-08 15:53:20

回答

2

很可能您从stream.readInt()获得的价值不符合您的预期。我建议将其打印出来并确保它是正确的。

可能有一个endianness问题,或者它可能是接收代码不是100%符合发送代码。

+0

这是票。我仔细检查了正在读取的数据,结果发现我正在读取一个巨大且不能处理的不同字节值。 – ChristianB 2012-02-08 16:24:15

0

为什么不写

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

内存管理这可能是一些通用的考虑:默认堆空间大小为64 MB。为了扩展它,您需要使用Xmx参数启动JVM。

java -Xmx512M