Java DataOutputStream/DataInputStream OutOfMemoryError

Java DataOutputStream/DataInputStream OutOfMemoryError,java,out-of-memory,datainputstream,dataoutputstream,Java,Out Of Memory,Datainputstream,Dataoutputstream,我正在尝试使用客户端上的DataOutputStream和服务器上的DataInputStream通过套接字发送包含16项的字节数组 这些是我用于发送/接收的方法。 public void sendBytes(byte[] myByteArray) throws IOException { sendBytes(myByteArray, 0, myByteArray.length); } public void sendBytes(byte[] myByteArray, int star

我正在尝试使用客户端上的DataOutputStream和服务器上的DataInputStream通过套接字发送包含16项的字节数组

这些是我用于发送/接收的方法。

public void sendBytes(byte[] myByteArray) throws IOException {
    sendBytes(myByteArray, 0, myByteArray.length);
}

public void sendBytes(byte[] myByteArray, int start, int len) throws IOException {
    if (len < 0)
        throw new IllegalArgumentException("Negative length not allowed");
    if (start < 0 || start >= myByteArray.length)
        throw new IndexOutOfBoundsException("Out of bounds: " + start);     
    dOutput.writeInt(len);
    if (len > 0) {
        dOutput.write(myByteArray, start, len);
        dOutput.flush();
    }       
}

public byte[] readBytes() throws IOException {
    int len = dInput.readInt();
    System.out.println("Byte array length: " + len); //prints '16'
    byte[] data = new byte[len];
    if (len > 0) {
        dInput.readFully(data);
    }
    return data;
}
public void sendBytes(byte[]myByteArray)引发IOException{
sendBytes(myByteArray,0,myByteArray.length);
}
public void sendBytes(byte[]myByteArray,int start,int len)引发IOException{
if(len<0)
抛出新的IllegalArgumentException(“不允许负长度”);
如果(开始<0 | |开始>=myByteArray.length)
抛出新的IndexOutOfBoundsException(“超出范围:+start”);
双输出写入(len);
如果(len>0){
写入(myByteArray、start、len);
dOutput.flush();
}       
}
公共字节[]readBytes()引发IOException{
int len=dInput.readInt();
System.out.println(“字节数组长度:+len);//打印'16'
字节[]数据=新字节[len];
如果(len>0){
数据输入(数据);
}
返回数据;
}
这一切都很好,我可以打印字节数组长度、字节数组(密文),然后解密字节数组并打印出我发送的原始明文,但在控制台打印后,程序立即崩溃,出现
OutOfMemoryError:Java heap space

我读过这篇文章,通常是因为没有刷新DataOutputStream,但我在sendBytes方法中调用了它,所以它应该在每个数组发送后清除它

编译器告诉我错误发生在readBytes中,行
byte[]data=new byte[len]
以及我在main方法中调用的
readBytes()

任何帮助都将不胜感激

编辑

我实际上得到了一些意想不到的结果

17:50:14服务器正在端口1500上等待客户端。
试图创建对象输入/输出流的线程
17:50:16客户端[0.7757499147242042]刚刚连接。
17:50:16服务器正在端口1500上等待客户端。
字节数组长度:16
服务器收到密文:2710-49-8312784-8148-85-57-38-13-126-886
服务器已将密文解密到:asd
17:50:19客户[0.7757499147242042]
字节数组长度:1946157921


我正在while循环中调用
readBytes()
,因此服务器将监听通过套接字传输的任何内容。我猜它正在尝试第二次运行它,即使没有发送任何其他内容,并且
len
变量不知何故被设置为1946157921。这背后可能有什么逻辑?

您必须通过套接字发送其他内容;不按你写的方式读;因此失去了同步。结果是你读的长度不是真正的长度;太大了;并在尝试分配时耗尽内存。故障不在这段代码中。当然,如果len==0,则在读取时不应分配bye数组

我读过这篇文章,通常是因为没有刷新DataOutputStream

事实并非如此

len变量以某种方式被设置为1946157921


一如预期。QED

在控制台中使用-Xms1500m运行您的应用程序,在Netbeans中,您可以在项目属性->运行->虚拟机选项中找到它

我今天遇到了这个内存不足的问题,在使用Xms进行了一些调整后,我能够解决这个问题。检查它是否适用于您,如果有更大的问题,那么您必须检查如何改进代码


可用堆即将用完。快速解决方法是将JVM启动参数中的-Xmx参数增加(或缺少指定)到应用程序能够完成手头任务的级别。

您是否认为传递字节长度???
len
对于可用内存来说太大。在分配字节数组之前,请尝试输出它,以查看请求的字节数。是否调试并查看了gc()的功能?请在出现故障的行之前打印出
len
。如果你能展示一个简短但完整的程序来演示这个问题,那将非常有帮助。@Henry,我正在输出它。我现在就试试看。这到底是做什么的?您的意思是建议设置
Xmx
,以增加最大堆空间。通过这种方式配置JVM内存使用,您还可以尝试-Xmx并尝试增加大小。我想,不确定,在win32中,你可以使用高达2GB的内存。@TimBender至少它今天对我有用。我在ArrayList中添加Java Robot拍摄的快照时遇到了问题。@Raj See:也许Netbeans对您很好,并为您设置了Xmx,但一般来说,Xms(最小大小)不能超过Xmx(最大大小)。您是对的。我用另一种方法通过套接字发送一个对象。我不知道同时使用ObjectOutputStreams和DataOutputStreams会导致套接字读写问题。不需要这样做,但每个套接字使用多个流充满了困难,最好避免。