【发布时间】:2021-07-01 05:50:31
【问题描述】:
我在另一台机器上遇到堆空间错误,但它在我的机器上运行 我不能把握另一台机器的属性。 如何在不使用的情况下解决此问题 Scanner.java ?
string.split 的参数是否正确,用“”表示在空格后分割字符串以将字符串分割成碎片?
[文件:]
U 1 234.003 30 40 50 true
T 2 234.003 10 60 40 false
Z 3 17234.003 30 40 50 true
M 4 0.500 30 40 50 true
/* 1000000+ lines */
java.lang.OutOfMemoryError: Java heap space
at java.base/java.util.Arrays.copyOfRange(Arrays.java:3821)
at java.base/java.lang.StringLatin1.newString(StringLatin1.java:764)
at java.base/java.lang.String.substring(String.java:1908)
at java.base/java.lang.String.split(String.java:2326)
at java.base/java.lang.String.split(String.java:2401)
at project.FileR(Fimporter.java:99)
public static DataBase File(String filename) throws IOException {
BufferedReader fs = new BufferedReader(new FileReader(filename),64 * 1024);
String line;
String[] wrds;
String A; int hash; double B; int C; int D; boolean E; DataBase DB = new DataBase();
while (true) {
line = fs.readLine();
if (line == null) {break;}
wrds = line.split(" "); /* this is line 99 in the error-message */
hash = Integer.parseInt(wrds[1]);
B = Double.parseDouble(wrds[2]);
C = Integer.parseInt(wrds[3]);
D = Integer.parseInt(wrds[4]);
E = Boolean.parseBoolean(wrds[5]);
// hash is hashcode for all values B C D E in DataBase DB
DB.listB.put(hash,B);
DB.listC.put(hash,C);
DB.listD.put(hash,D);
DB.listE.put(hash,E);
}
【问题讨论】:
-
从您的代码来看,拆分似乎不是问题,但如果您在
DataBase中保留大量数据,则可能会导致 OOM。您是否在机器上设置了不同的内存限制,例如通过-Xmx?您是否进行了堆转储并对其进行了分析,例如使用 Eclipse MAT? -
如果另一台机器上的 JVM 是 X86 32 位,它最多可能只有 1.4 到 1.6 GB 的堆空间。 X64 受限于使用的 RAM 数量。
-
@SamuelMarchant - 这是真的。但是,如果 OP 根本没有指定
-Xmx,那么 JVM 将具有 default 最大大小,通常比使用-Xmx成功请求的大小要小很多。 (此外,现在在野外找到 32 位机器变得越来越难......) -
@Stephan C 没有多少通用 32 位,不,但如果你想在许多 X64 计算机上安装 Linux 或更旧的 MS Win 中的 X32 内核变体,那么它是 32(句号)。它也可能取决于另一台机器上的 JVM 类型 32 或 64,即使我认为这些天可能只是 X64 CPU,但这并不能阻止机器具有 x32(86 - i586) JVM,但是,很好指出如果它是 X86 jvm 二进制文件来增加程序命令行上的堆大小 * 类似点击 - 也很好。
标签: java file heap-memory space