从文件中读取 - 堆已满
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
.
我正在尝试读取文件并将它们放入哈希映射中。当我读取一个大文件或一个只有一句话的文件时它工作正常,但是当我读取这两个文件时它抛出
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
.