gpt4 book ai didi

java - 为什么我的程序越来越慢?

转载 作者:搜寻专家 更新时间:2023-10-31 08:24:50 24 4
gpt4 key购买 nike

我正在使用该程序将数据从数据库发送到 Excel 文件。它在开始时运行良好,然后变得越来越慢,最后它耗尽内存并出现以下错误:“java.lang.OutOfMemoryError:Java heap space ...”。

通过添加jvm heap sapce可以解决问题,但问题是运行程序耗时太长。

几分钟后,它完成了一个循环,用了 4 秒,可以在开始时用 0.5 秒完成。我找不到使它始终以特定速度运行的解决方案。

是我的代码问题吗?

有什么线索吗?

代码如下:

public void addAnswerRow(List<FinalUsers> finalUsersList,WritableWorkbook book){

if (finalUsersList.size() >0 ) {
try {
WritableSheet sheet = book.createSheet("Answer", 0);
int colCount = 0;
sheet.addCell(new Label(colCount++,0,"Number"));
sheet.addCell(new Label(colCount++,0,"SchoolNumber"));
sheet.addCell(new Label(colCount++,0,"District"));
sheet.addCell(new Label(colCount++,0,"SchoolName"));
sheet.setColumnView(1, 15);
sheet.setColumnView(3, 25);

List<Elements> elementsList = this.elementsManager.getObjectElementsByEduTypeAndQuestionnaireType(finalUsersList.get(0).getEducationType().getId(), this.getQuestionnaireByFinalUsersType(finalUsersList.get(0).getFinalUsersType().getId()));

Collections.sort(elementsList, new Comparator<Elements>(){

public int compare(Elements o1, Elements o2) {

for(int i=0; i< ( o1.getItemNO().length()>o2.getItemNO().length()? o2.getItemNO().length(): o1.getItemNO().length());i++){
if (CommonFun.isNumberic(o1.getItemNO().substring(0, o1.getItemNO().length()>3? 4: o1.getItemNO().length()-1)) && !CommonFun.isNumberic(o2.getItemNO().substring(0, o2.getItemNO().length()>3? 4: o2.getItemNO().length()-1))){
return 1;
}
if (!CommonFun.isNumberic(o1.getItemNO().substring(0, o1.getItemNO().length()>3? 4: o1.getItemNO().length()-1)) && CommonFun.isNumberic(o2.getItemNO().substring(0,o2.getItemNO().length()>3? 4:o2.getItemNO().length()-1))){
return -1;
}
if ( o1.getItemNO().charAt(i)!=o2.getItemNO().charAt(i) ){

return o1.getItemNO().charAt(i)-o2.getItemNO().charAt(i);
}
}
return o1.getItemNO().length()> o2.getItemNO().length()? 1:-1;
}});

for (Elements elements : elementsList){
sheet.addCell(new Label(colCount++,0,this.getTitlePre(finalUsersList.get(0).getFinalUsersType().getId(), finalUsersList.get(0).getEducationType().getId())+elements.getItemNO()+elements.getItem().getStem()));
}

int sheetRowCount =1;
int sheetColCount =0;

for(FinalUsers finalUsers : finalUsersList){

sheetColCount =0;

sheet.addCell(new Label(sheetColCount++,sheetRowCount,String.valueOf(sheetRowCount)));
sheet.addCell(new Label(sheetColCount++,sheetRowCount,finalUsers.getSchool().getSchoolNumber()));
sheet.addCell(new Label(sheetColCount++,sheetRowCount,finalUsers.getSchool().getDistrict().getDistrictNumber().toString().trim()));
sheet.addCell(new Label(sheetColCount++,sheetRowCount,finalUsers.getSchool().getName()));

List<AnswerLog> answerLogList = this.answerLogManager.getAnswerLogByFinalUsers(finalUsers.getId());


Map<String,String> answerMap = new HashMap<String,String>();

for(AnswerLog answerLog :answerLogList ){
if (answerLog.getOptionsId() != null)
{
answerMap.put(answerLog.getElement().getItemNO(), this.getOptionsAnswer(answerLog.getOptionsId()));
}else if (answerLog.getBlanks()!= null){

answerMap.put(answerLog.getElement().getItemNO(), answerLog.getBlanks());
}else{

answerMap.put(answerLog.getElement().getItemNO(), answerLog.getSubjectiveItemContent());
}
}
for (Elements elements : elementsList){

sheet.addCell(new Label(sheetColCount++,sheetRowCount,null==answerMap.get(elements.getItemNO())?"0":answerMap.get(elements.getItemNO())));

}

sheetRowCount++;
}

book.write();
book.close();

} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (RowsExceededException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (WriteException e) {

// TODO Auto-generated catch block
e.printStackTrace();
}

}

最佳答案

您在某处创建对象并保留对它们的可达引用。

您可能正在将对象添加到集合中并且从未删除它们……所以集合只会增长直到内存耗尽。当您接近最大堆大小时,垃圾收集器会过度负担以寻找可用内存来重新组织事物,并且您越接近限制,程序就会呈指数级变慢。

此外,您可能每次都忘记关闭某些对象,例如您的工作簿。

关于java - 为什么我的程序越来越慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2339876/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com