【发布时间】:2011-11-25 02:20:05
【问题描述】:
我正在编写一些代码来将一个非常大的平面文本文件解析为持久保存到数据库的对象。这适用于文件的某些部分(即,如果我“置顶”前 2000 行),但当我尝试处理完整文件时遇到java.lang.OutOfMemoryError: Java heap space 错误。
我正在使用 BufferedReader 逐行读取文件,我的印象是这否定了将整个文本文件加载到内存中的要求。希望我的代码是不言自明的。我通过 Eclipse Memory Analyser 运行了我的代码,它告诉我:
线程 java.lang.Thread @ 0x27ee0478 main 保存总大小为 69,668,888 (98.76%) 字节的局部变量。
加载的“char[]”的一个实例中累积
内存在“”**
非常感谢有帮助的 cmets!
乔纳森
public ArrayList<Statement> parseGMIFile(String filePath)
throws IOException {
ArrayList<Statement> statements = new ArrayList<Statement>();
// Statement Properties
String sAccount = "";
String sOffice = "";
String sFirm = "";
String sDate1 = "";
String sDate2 = "";
Date date = new Date();
StringBuffer sData = new StringBuffer();
BufferedReader in = new BufferedReader(new FileReader(filePath));
String line;
String prevCode = "";
int lineCounter = 1;
int globalLineCounter = 1;
while ((line = in.readLine()) != null) {
// We extract the GMI code from the end of the first line
String newCode = line.substring(GMICODE_START_POS).trim();
// Extract date
if (newCode.equals(prevCode)) {
if (lineCounter == DATE_LINE) {
sDate1 = line.substring(DATE_START_POS, DATE_END_POS).trim();}
if (lineCounter == DATE_LINE2) {
sDate2 = line.substring(DATE_START_POS, DATE_END_POS).trim();}
if (sDate1.equals("")){
sDate1 = sDate2;}
SimpleDateFormat formatter=new SimpleDateFormat("MMM dd, yyyy");
try {
date=formatter.parse(sDate1);
} catch (ParseException e) {
e.printStackTrace();
}
sFirm = line.substring(FIRM_START_POS, FIRM_END_POS);
sOffice = line.substring(OFFICE_START_POS, OFFICE_END_POS);
sAccount = line.substring(ACCOUNT_START_POS,
ACCOUNT_END_POS);
lineCounter++;
globalLineCounter++;
sData.append(line.substring(0, END_OF_DATA)).append("\n");
} else {
// Instantiate New Statement Object
Statement stmt = new Statement(sAccount, sOffice, sFirm,
date, sData.toString());
// Add to collection
statements.add(stmt);
// log.info("-----------NEW STATEMENT--------------");
sData.setLength(0);
lineCounter = 1;
}
prevCode = newCode;
}
return statements;
}
STACKTRACE:线程“main”org.springframework.beans.factory.BeanCreationException 中的异常:在类路径资源 [app-context.xml] 中定义名称为“dbPopulator”的 bean 创建错误:调用 init 方法失败;嵌套异常是 java.lang.OutOfMemoryError: Java heap space
在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1401)
在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:512)
在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:450)
在 org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:290)
在 org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222)
在 org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:287)
在 org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:189)
在 org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:557)
在 org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:842)
在 org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:416)
在 org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:139)
在 org.springframework.context.support.ClassPathXmlApplicationContext.(ClassPathXmlApplicationContext.java:93)
在 Main.main(Main.java:11)
引起:java.lang.OutOfMemoryError: Java heap space
在 java.util.Arrays.copyOf(Arrays.java:2882)
在 java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
在 java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:390)
在 java.lang.StringBuffer.append(StringBuffer.java:224)
在 services.GMILogParser.parseGMIFile(GMILogParser.java:133)
在 services.DBPopulator.init(DBPopulator.java:27)
在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
在 java.lang.reflect.Method.invoke(Method.java:597)
在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeCustomInitMethod(AbstractAutowireCapableBeanFactory.java:1529)
在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1468)
在 org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1398)
... 12 更多
【问题讨论】:
-
如果您不在服务器虚拟机上,默认堆空间为 64 MB,您可以尝试将其增加到 512MB 或更多。
标签: java parsing out-of-memory