我如何解决OutOfMemoryError:Java堆空间

时间:2013-05-03 04:56:31

标签: java out-of-memory

我在注释行上收到以下错误:

"OutOfMemoryError: Java heap space" 

data.bin文件很大,所以预计会出现此错误。我的问题是我如何解决这个错误?我见过像-Xmx1024m或类似的东西,但我不知道如何使用 jgrasp 编译器

运行它
 try {
    RandomAccessFile data = new RandomAccessFile("data.bin","rws");
    long l = data.length();
    long recs = l / 1024;
    long cnt = 0;
    byte []b = new byte[1024];

    while(cnt < recs){
       cnt++;
       data.readFully(b);
       byte []key = Arrays.copyOfRange(b, 0, 24);
       byte []value = Arrays.copyOfRange(b, 24, 1024);
       en = new TEntry<String, String>(new String(key), new String(value));//ERROR
       lst.add(en);
    }

3 个答案:

答案 0 :(得分:2)

您可以使用以下命令增加堆/堆栈大小:

-Xms<size>        set initial Java heap size
-Xmx<size>        set maximum Java heap size
-Xss<size>        set java thread stack size

您还可以找到更多descriptive answers over here

答案 1 :(得分:1)

您需要根据需要在可用主内存的边界内设置堆最小和最大大小。您可以通过将以下参数添加到java运行时来实现 -J-Xmx1024m -J-Xms512m

你在Windows上吗?在安装文件夹中有一个名为“winconfig.exe”的文件,双击它,您可以在那里更改堆。如果您使用的是Linux或Mac OS,它可能会被称为类似的东西(其中包含“config”一词)。

jgrasp -J-Xmx512m -J-Xms512m

答案 2 :(得分:0)

您正在尝试将整个文件加载到内存中。将Bytes转换为字符串时,它将占用文件大小的两倍。 (字符串使用16位字符)要么你有足够的内存来执行此操作(在这种情况下增加最大值),要么在程序执行时需要更改。

您可以只加载值并记住这些值的位置,而不是尝试加载所有键和值。即将偏移量存储在该值的文件中。

再次查找该值时,需要根据需要读取该值。在这种情况下,它可以将您需要的内存减少20倍。