繁体   English   中英

Java-读取具有特定jvm大小的文本文件

[英]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 VisualVMJProfiler)检查应用程序。 这些应用程序使您可以检查程序内存的分配方式,也许还可以查看在哪里使用了过多的内存。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM