【问题标题】:How do I fix this java.lang.OutOfMemoryError: Java heap space?如何修复这个 java.lang.OutOfMemoryError: Java heap space?
【发布时间】:2018-07-04 05:20:33
【问题描述】:

我得到一个 java.lang.OutOfMemoryError: Java heap space。我不确定我做错了什么。这是我的代码:

StringBuffer finalString = new StringBuffer();

    try {
        BufferedReader br = new BufferedReader(new FileReader("collegeData 2.txt"));
        StringBuffer returnFile = new StringBuffer();
        returnFile.append(br.readLine() + br.readLine());
        ArrayList<String> allData = new ArrayList<String>();

        boolean completedFirstSection = false;
        int count = 2;
        String addString = "";  

        String nextLine;

        while ((nextLine=br.readLine())!=null) {
            if(count < 990) {
                addString += nextLine;
                count++;
            } else {
                String sub = nextLine.substring(16);
                sub = sub.substring(0, sub.length());

                addString = sub + ":{" + nextLine + "," + addString.substring(0, addString.length()-2) + br.readLine();
                br.readLine();
                allData.add(addString);
                count = 2;
            }
        }
        allData.add("}}]");
        System.out.println("here");
        System.out.println(returnFile.toString());
        finalString = returnFile;
        br.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

collegeData 2.txt 为 44.2 mb,它是一个 json 文件。这是我的错误信息。

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.base/jdk.internal.misc.Unsafe.allocateUninitializedArray(Unsafe.java:1250)
at java.base/java.lang.invoke.StringConcatFactory$MethodHandleInlineCopyStrategy.newArray(StringConcatFactory.java:1605)
at java.base/java.lang.invoke.DirectMethodHandle$Holder.invokeStatic(DirectMethodHandle$Holder)
at java.base/java.lang.invoke.LambdaForm$BMH/754666084.reinvoke(LambdaForm$BMH)
at java.base/java.lang.invoke.LambdaForm$MH/801197928.linkToTargetMethod(LambdaForm$MH)
at RunnerCombined.main(RunnerCombined.java:31)

RunnerCombined.java:31 是上面的 'addString += nextLine'。

提前感谢您的帮助!

【问题讨论】:

  • 不确定这是否是错误的原因,但您应该真正使用StringBuilder 或StringBuffer(如果需要考虑同步),而不是String 用于addString。 Strings 是不可变的,因此每次追加都需要分配一个新对象并进行复制。
  • 哦,说得好!让我试一试,我是否应该创建一个字符串缓冲区,然后每次都清除该字符串缓冲区?

标签: java bufferedreader stringbuffer


【解决方案1】:

感谢 twain249!把我的代码改成这个后,我的程序运行很快,很完美!

StringBuffer finalString = new StringBuffer();

    try {
        BufferedReader br = new BufferedReader(new FileReader("collegeData 2.txt"));
        StringBuffer returnFile = new StringBuffer();
        returnFile.append(br.readLine() + "\n" + br.readLine() + "\n");

        boolean completedFirstSection = false;
        int count = 2;
        StringBuffer addString = new StringBuffer();

        String nextLine;

        while ((nextLine=br.readLine())!=null) {
            if(count < 990) {
                addString.append(nextLine + "\n");
                count++;
            } else {
                String sub = nextLine.substring(16);
                sub = sub.substring(0, sub.length());

                // addString = sub + ":{" + nextLine + "," + addString.substring(0, addString.length()-2) + br.readLine();
                returnFile.append(sub + ":{" + nextLine + "," + "\n");
                returnFile.append(addString.substring(0, addString.length()-2) + "\n");
                returnFile.append(br.readLine() + "\n");
                addString.setLength(0);
                count = 2;
                br.readLine();
            }
        }
        returnFile.append("}}]");
        finalString = returnFile;
        br.close();
    } catch (IOException e) {
        e.printStackTrace();
    }

【讨论】:

    猜你喜欢
    • 2013-06-20
    • 2013-05-18
    • 2012-08-03
    • 2018-12-25
    • 2014-06-15
    • 2016-04-15
    • 2010-09-07
    相关资源
    最近更新 更多