簡體   English   中英

內存不足Java堆大小

[英]out of memory java heap size

http://www.coderpanda.com/java-socket-programming-transferring-large-sized-files-through-socket/

上面鏈接中的代碼有效,但是最多可以傳輸一定數量的數據。 當我嘗試傳輸大小約為334 MB的.mkv格式的電影時,出現“內存不足,Java堆大小”錯誤。 我是一個初學者,我不知道如何解決這個問題,我試圖增加客戶端程序中的buffersize,但問題仍然存在。 請幫我。

問題是這一行:

byte[] readBuffer = new byte[1024 * 100000];

那正在分配〜100 Mbytes的緩沖區……這是非常大的。

減少它(減少10或100倍),或者使用更大的堆運行您的應用程序。

(上面的@Aaron Digulla和@Holger的評論也很合適。這實際上不是所謂的“高質量”代碼...)

您需要查看JVM內存參數。 您需要增加JVM堆大小,而不是緩沖區大小。 檢查此參數

-Xmx2048m -> this param to set the max memory that the JVM can allocate
-Xms1024m -> the init memory that JVM will allocate on the start up
-XX:MaxPermSize=512M -> this for the max Permanent Generation memory
-XX:MaxNewSize=  -> this need to be 40% from your Xmx value
-XX:NewSize=614m -> this need to be 40% from your Xmx value

嘗試使用jdk 5.0或更高版本。 在jdk 4.0中,初始堆大小為64 MB.JDK 7.0 u9或更高版本會更好。

該鏈接中的大多數代碼都是垃圾。 復制流時,不必使用巨大的緩沖區,當然也不必使用System.arraycopy()。 任何合理的緩沖區大小都可以。 這不會是數百兆字節,而是以千字節為單位。

在Java中復制流的規范方法如下:

while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}

這適用於任何大於零的緩沖區。 請注意,在復制期間沒有System.arraycopy(),也沒有分配新的字節數組,因此它不可能用完內存。 還需要注意的是它比你的鏈接代碼簡單得多

您的問題被標記為NIO,但是鏈接中的代碼使用流,因此我為您提供了基於流的答案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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