2

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

"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);
    }
4

3 回答 3

2

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

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

您还可以在此处找到更多描述性答案

于 2013-05-03T05:11:03.820 回答
1

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

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

jgrasp -J-Xmx512m -J-Xms512m

于 2013-05-03T05:12:55.843 回答
0

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

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

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

于 2013-05-03T05:52:20.393 回答