我不是世界上经验最丰富的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;
}
我正在读取堆栈,以便在开始处理之前知道文件中的行数,这样我就可以让用户知道文件的存在距离。
显然这是一个玩具示例,而在真实版本中它的功能不止于此,但是我可以使用上面提到的代码版本来复制问题。我目前正在尝试阅读4个文件,第一个文件只有50多万行,第二个只有25万多个。该程序在尝试阅读第三个文件时爆炸。
我做错了什么想法?
谢谢, 瑞克
答案 0 :(得分:3)
您可以使用-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;
最后,这就是“Stack lines”对象,它保留了大量内存。如果您不想增加内存,请在while(...)循环中执行操作。
答案 1 :(得分:0)
您是否尝试过增加最大堆大小?
java -Xms<initial heap size> -Xmx<maximum heap size>
编辑:噢..已经有了答案