我在注释行上收到以下错误:
"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);
}
答案 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倍。