Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java内存泄漏-文件读取器、缓冲读取器和堆栈_Java_Memory Management_Memory Leaks - Fatal编程技术网

Java内存泄漏-文件读取器、缓冲读取器和堆栈

Java内存泄漏-文件读取器、缓冲读取器和堆栈,java,memory-management,memory-leaks,Java,Memory Management,Memory Leaks,我不是世界上最有经验的Java程序员,我正在尝试创建一个工具来接收数据并将其存储起来,但我遇到了内存泄漏(至少我认为这就是正在发生的事情,无论哪种方式,我都得到了Java.lang.OutOfMemoryError:Java堆空间) 以下是违规代码: public static void main(String[] args) { File inputDirectory = new File(args[0]); File[] files = inputDirectory.list

我不是世界上最有经验的Java程序员,我正在尝试创建一个工具来接收数据并将其存储起来,但我遇到了内存泄漏(至少我认为这就是正在发生的事情,无论哪种方式,我都得到了Java.lang.OutOfMemoryError:Java堆空间)

以下是违规代码:

public static void main(String[] args)
{
    File inputDirectory = new File(args[0]);
    File[] files = inputDirectory.listFiles();
    for(int i = 0 ; i < files.length ; ++i)
    {
        DoSomethingWithTheFile(files[i]);
    }
}

public static void DoSomethingWithTheFile(File inputFile) throws VariousExceptions
{
    boolean result = false;
    if(inputFile.exists())
    {
        FileReader fr = new FileReader(inputFile);
        BufferedReader br = new BufferedReader(fr);
        Stack lines = new Stack();
        String line;
        while((line = br.readLine()) != null)
        {
            lines.push(line);
        }
        br.close();
        int numberOfRecords = lines.size();
        for(int i = 0 ; i < numberOfRecords ; ++i)
        {
            String theString = (String)lines.pop();
        }
        result = true;
    }
    return result;
}
publicstaticvoidmain(字符串[]args)
{
File inputDirectory=新文件(args[0]);
File[]files=inputDirectory.listFiles();
对于(int i=0;i
我正在读取一个堆栈,以便在开始处理之前知道文件中的行数,以便让用户知道我们在文件中的位置

显然,这是一个玩具示例,在真实版本中,它做的不止这些,但是我可以用上面的代码精简版本来复制这个问题。我目前正在尝试读取4个文件,第一个文件的行数刚刚超过50万行,第二个文件的行数刚刚超过25万行。程序在试图读取第三个文件时爆炸了

你知道我做错了什么吗

谢谢,
Rik

您可以使用-Xmx选项增加分配给程序的最大内存:

java -Xmx256m -jar yourApplication.jar
此外,关闭流的更好方法是使用try/catch/finally。“finally”语句始终运行,即使抛出异常也是如此。它将类似于:

boolean result = false;
if(inputFile.exists())
{
    FileReader fr = null;
    BufferedReader br = null;
    try{
        fr = new FileReader(inputFile);
        br = new BufferedReader(fr);
        Stack lines = new Stack();
        String line;
        while((line = br.readLine()) != null)
        {
            lines.push(line);
        }
        br.close();
        int numberOfRecords = lines.size();
        for(int i = 0 ; i < numberOfRecords ; ++i)
        {
            String theString = (String)lines.pop();
        }
        result = true;
    }
    finally{
        if( br != null ) br.close();
        if( fr != null ) fr.close();
    }
}
return result;
boolean结果=false;
if(inputFile.exists())
{
FileReader fr=null;
BufferedReader br=null;
试一试{
fr=新文件读取器(inputFile);
br=新的缓冲读取器(fr);
堆栈线=新堆栈();
弦线;
而((line=br.readLine())!=null)
{
推(线);
}
br.close();
int numberOfRecords=lines.size();
for(int i=0;i

最后,这是“堆栈线”对象,它保留了大量内存。如果不想增加内存,请在while(…)循环中执行操作。

是否尝试增加最大堆大小

java -Xms<initial heap size> -Xmx<maximum heap size>
java-Xms-Xmx

编辑:Ow。。已经有了答案

我认为最好在finally块中包含
close()
语句,以确保它被执行。文件有多大(以字节为单位,而不是以行为单位)?根据输入的字符编码,Java可能需要大约两倍的内存;增加-Xmx JVM设置以在需要时分配更多内存您不需要显式关闭FileReader:@alain.janinm:很高兴知道这一点。