内存不足java堆大小

时间:2014-01-29 08:09:46

标签: java sockets nio

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

上述链接中的代码正在运行,但可以传输一定数量的数据。当我试图传输大小约为334 MB的格式为.mkv的电影时,它给出了“内存不足,java堆大小”的错误。我是一个初学者,我不知道如何解决这个问题我试图增加客户端程序中的缓冲区大小但问题仍然存在。请帮帮我。

4 个答案:

答案 0 :(得分:6)

问题在于这一行:

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

那就是分配一个大约100 MB的缓冲区......这个缓冲区很大。

要么减少它(10或100倍),要么运行更大堆的应用程序。

(@ Aaron Digulla和@ Holger上面的评论也是合适的。这真的不是所谓的“高质量”代码......)

答案 1 :(得分:0)

您需要查看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

答案 2 :(得分:0)

尝试使用jdk 5.0或更高版本。 在jdk 4.0中,初始堆大小为64 MB.JDK 7.0 u9或更高版本会好得多。

答案 3 :(得分:0)

该链接中的大部分代码都是完全垃圾。没有必要使用巨大的缓冲区,并且在复制流时当然不必使用System.arraycopy()。任何合理的缓冲区大小都可以。这不会是几百兆字节,它将以千字节为单位。

在Java中复制流的规范方法如下:

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

这适用于任何大于零的缓冲区大小。请注意,在复制期间没有System.arraycopy()并且没有新字节数组的分配,因此它不可能耗尽内存。另请注意,比链接中的代码更简单

你的问题被标记为NIO,但链接中的代码使用了流,所以我给你一个基于流的答案。

相关问题