从文件中读取 - 堆已满

Read from file - Heap full

我正在尝试读取文件并将它们放入哈希映射中。当我读取一个大文件或一个只有一句话的文件时它工作正常,但是当我读取这两个文件时它抛出

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

在放入 hashmap 之前,我将文本放入 StringBuffer。是 StringBuffer 使堆满了吗? 我的代码是:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Scanner;

public class testforso {
public static void main(String args[]) throws FileNotFoundException {
    Scanner sc = new Scanner(System.in);
    ArrayList<String> fileNames = new ArrayList<String>();
    ArrayList<ArrayList<ArrayList<String>>> listWithFiles = new 
ArrayList<ArrayList<ArrayList<String>>>();
    String fileName;

    System.out.println("Enter the file names\t(Type stop to exit):");
    fileName = sc.next();
    while (!fileName.equals("stop")) {
        fileNames.add(fileName);
        fileName = sc.next();
    }

    for (int i = 0; i < fileNames.size(); i++) {
        Litourgia1 file = new Litourgia1(fileNames.get(i));
        listWithFiles.add(file.getWords());
    }
    System.out.println("Files read successfully");

    HashMap<String, HashMap<String, Integer>> hm = new HashMap<String, HashMap<String, Integer>>();
    HashMap<String, Integer> hm2 = new HashMap<String, Integer>();
    for (int i = 0; i < listWithFiles.size(); i++) { // for loop to get into files
        for (int j = 0; j < listWithFiles.get(i).size(); j++) { // for loop to get into sentences
            for (int k = 0; k < listWithFiles.get(i).get(j).size(); k++) { // for loop to get into words
                if (hm.containsKey(listWithFiles.get(i).get(j).get(k)))
                    hm2.put(listWithFiles.get(i).get(j).get(k), hm2.get(listWithFiles.get(i).get(j).get(k)) + 1);
                else
                    hm2.put(listWithFiles.get(i).get(j).get(k), 1);

            }
            for (int k = 0; k < listWithFiles.get(i).get(j).size(); k++) { // for loop to get into words
                if (!hm.containsKey(listWithFiles.get(i).get(j).get(k))) {
                    hm.put(listWithFiles.get(i).get(j).get(k), hm2);
                }
            }
        }
    }
    System.out.println(hm.toString()); //the Exception is in this line
}

}

谢谢

OutOfMemoryError 当 JVM 用完堆内存时抛出。

如果您的 JVM 的堆内存大小为 512MB,而您正尝试读取一个 1GB 的文件,那么您会收到此消息,因为没有足够的堆内存分配给您的 JVM。

要增加它,您可以在 运行 您的 java 程序中使用以下参数:

-Xmx2048M

以下应将最大 Java 堆大小设置为 2048MB 或 2GB。

例如:

java -jar -Xmx2048M someproject.jar

如果您使用的是 IDE,那么您应该能够配置 program arguments,在这种情况下,您只需添加 -Xmx2048M.