[英]Java - read text file with specific jvm size
我创建了一个仅包含字符“ a”的.txt测试文件。 文件大小约为20 MB。 我试图通过三种方式读取文件
使用BufferedReader
String fileName = "C:\\testFile.txt";
FileReader fileReader = new FileReader(fileName);
try (BufferedReader bufferedReader = new BufferedReader(fileReader)) {
String line;
while ((line = bufferedReader.readLine()) != null) {
System.out.println(line);
}
}
使用扫描仪
Scanner sc = null;
try {
sc = new Scanner(new File("C:\\testFile2.txt"), "UTF-8");
while (sc.hasNextLine()) {
String line = sc.nextLine();
System.out.println(line);
}
if (sc.ioException() != null) {
throw sc.ioException();
}
} finally {
if (sc != null) {
sc.close();
}
}
并且,使用Java8流
try (Stream<String> stream = Files.lines(Paths.get(fileName))) {
stream.forEach(System.out::println);
}
我使用eclipse运行配置设置了jvm堆大小,如下所示:http://www.planetofbits.com/eclipse/increase-jvm-heap-size-in-eclipse/
在这三种情况下,我的值都是:-Xms5M -Xmx100M。
即使文件大小为20MB,它始终会给出java.lang.OutOfMemoryError。 当我将堆大小设置为-Xmx200M时,它对所有人都运行良好。 我想知道是什么耗尽了内存,是否还有另一种更有效利用内存的方式来读取文件。
任何帮助表示赞赏。
编辑 分析
谢谢兰恩和亚当。 我确实使用Jprofiler作为扫描程序代码。 char []数组中 显示的内存使用量 很大,而OverAll的内存使用量
有趣的是,char []数组占据了这么多。 不知道为什么!
旁注:现在,我将测试文件更改为包含整数和换行符,因此每一行都包含一个随机整数。 有了该文件,我可以使用Scanner轻松读取文件(甚至100MB的大小),因为它一次只能读取一行。 以前,文件中只有字符“ a”,没有新行。
回答问题的最好方法(imo)是使用内存配置工具(例如Java VisualVM或JProfiler)检查应用程序。 这些应用程序使您可以检查程序内存的分配方式,也许还可以查看在哪里使用了过多的内存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.