![](/img/trans.png)
[英]Use of DataInputStream and DataOutputStream in java networking
[英]Java DataOutputStream / DataInputStream OutOfMemoryError
我正在嘗試使用客戶端上的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;
}
一切正常,我可以打印字節數組長度,字節數組(密文),然后解密字節數組並打印出我發送的原始明文,但是在控制台中打印完后,程序立即崩潰,並出現OutOfMemoryError: Java heap space
。
我讀過這通常是因為沒有刷新DataOutputStream,但是我在sendBytes方法內部調用了它,因此在發送每個數組之后都應該將其清除。
編譯器告訴我該錯誤發生在該行的byte[] data = new byte[len];
readBytes內部byte[] data = new byte[len];
以及我在main方法中調用readBytes()
的位置。
任何幫助將不勝感激!
編輯
我實際上得到了一些意想不到的結果。
17:50:14 Server waiting for Clients on port 1500. Thread trying to create Object Input/Output Streams 17:50:16 Client[0.7757499147242042] just connected. 17:50:16 Server waiting for Clients on port 1500. Byte array length: 16 Server recieved ciphertext: 27 10 -49 -83 127 127 84 -81 48 -85 -57 -38 -13 -126 -88 6 Server decrypted ciphertext to: asd 17:50:19 Client[0.7757499147242042] Byte array length: 1946157921
我在while循環中調用readBytes()
,因此服務器將監聽通過套接字傳輸的所有內容。 我猜想即使沒有發送任何東西並且len
變量以某種方式設置為1946157921,它還是試圖再次運行它。
您必須通過套接字發送其他內容; 閱讀方式與編寫方式不同; 因此變得不同步。 結果將是您正在讀取的長度不是真實長度; 太大 並在嘗試分配它時耗盡內存。 錯誤不在此代碼中。 當然,如果len == 0,則在讀取時不應分配再見數組。
我讀過這通常是因為沒有刷新DataOutputStream
不是。
len變量以某種方式設置為1946157921。
完全符合預期。 QED
您的可用堆已用完。 對此的快速解決方案是將JVM啟動參數中的-Xmx參數增加(或指定為丟失),使其達到應用程序能夠完成手頭任務的級別。
在控制台中使用-Xms1500m運行應用程序,在Netbeans中,您可以在項目屬性->運行-> VM選項中找到它。
我今天遇到了內存不足的問題,並且在用Xms進行了一段時間的調整之后,我得以解決該問題。 檢查它是否與您一起使用,如果有比它大得多的東西,那么這比您必須檢查如何改進代碼更重要。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.