簡體   English   中英

Java DataOutputStream / DataInputStream OutOfMemoryError

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM