java报错内存不释放_在java中使用大字符串时StringBuilder内存不足错误

我从String test = str;测试成倍增长,成千上万的角色.运行需要45分钟,可能是因为创建了大字符串并删除了垃圾.然后,我将这样的输入交错,使其达到30秒.

这似乎是一种廉价的方式,但效果很好:

if (secondDump.length() > 50)

{

intermedDump = intermedDump + secondDump;

secondDump = "";

}

if (intermedDump.length() > 100)

{

thirdDump = thirdDump + intermedDump;

intermedDump = "";

}

if (thirdDump.length() > 500)

{

fourthDump = fourthDump + thirdDump;

thirdDump = "";

}

if (fourthDump.length() > 1000)

{

fifthDump = fifthDump + fourthDump;

fourthDump = "";

}

//with just this and not sixth. Runtime>>>> : 77343

if (fifthDump.length() > 5000)

{

sixthDump = sixthDump + fifthDump;

fifthDump = "";

}

//with just this. Runtime>>>> : 35903Runtime>>>> : 33780

if (sixthDump.length() > 10000)

{

fillerDump = fillerDump + sixthDump;

sixthDump = "";

}

然后我发现StringBuilder存在,我一直在尝试使用它,用它替换所有的字符串操作.

问题是,我不断收到带有java内存堆溢出的java.lang.OutOfMemoryError.我认为字符串太长而无法作为StringBuilder对象存储在内存中,因为它占据了我之前的代码在崩溃时出现内存不足错误的大约1/50的进度.它只能使用不到一千个字符.

为什么一个字符串可以保存整个输出,这不能接近?另外,如果我将文本追加到JTextPane,那需要多少内存?如果我将StringBuilder内容转储到JTextpane并继续追加并清除似乎不起作用的StringBuilder.

这是现有的代码. Page只是一个被传递的对象:

protected void concatPlates(page PageA) throws IOException

{

if (backend.isFirstPage == false)

{

frontend.fillOutputPane("\n " +

" \n", PageA);

frontend.fillOutputPane(" " +

" \n", PageA);

frontend.fillOutputPane(" " +

" \n", PageA);

}

for (int i = 0; i < PLATELEN-1; i++)

{

if (arrLeftCol[i].length() == 0)

{

/

/

frontend.fillOutputPane(arrLeftCol[i].append(

arrRightCol[i]));

}

else

{

PageA.tempStrBuff = new StringBuilder(arrLeftCol[i].substring(0,40));

frontend.fillOutputPane(PageA.tempStrBuff.append(arrRightCol[i]));

}

arrLeftCol[i].append("");

arrRightCol[i].append("");

backend.isFirstPage = false;

}

}

//this is the frontend class

public static void fillOutputPane(String s, page PageA)

{

fillOutputPane(PageA.getStrBuf());

}

public static void fillOutputPane(StringBuilder stringBuild)

{

try

{

str.append(stringBuild);

}

catch (java.lang.OutOfMemoryError e)

{

System.out.println((str.length() * 16) /8);

//System.out.println(str);

System.out.println("out of memory error");

System.exit(0);

}

}

这是错误:

Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space

at java.util.Arrays.copyOf(Unknown Source)

at java.lang.AbstractStringBuilder.expandCapacity(Unknown Source)

at java.lang.AbstractStringBuilder.append(Unknown Source)

at java.lang.StringBuilder.append(Unknown Source)

at java.lang.StringBuilder.append(Unknown Source)

at backend.fill(backend.java:603)

at frontend$openL.actionPerformed(frontend.java:191)

at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)

at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)

at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)

at javax.swing.DefaultButtonModel.setPressed(Unknown Source)

at javax.swing.AbstractButton.doClick(Unknown Source)

at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)

at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)

at java.awt.Component.processMouseEvent(Unknown Source)

at javax.swing.JComponent.processMouseEvent(Unknown Source)

at java.awt.Component.processEvent(Unknown Source)

at java.awt.Container.processEvent(Unknown Source)

at java.awt.Component.dispatchEventImpl(Unknown Source)

at java.awt.Container.dispatchEventImpl(Unknown Source)

at java.awt.Component.dispatchEvent(Unknown Source)

at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)

at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)

at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)

at java.awt.Container.dispatchEventImpl(Unknown Source)

at java.awt.Window.dispatchEventImpl(Unknown Source)

at java.awt.Component.dispatchEvent(Unknown Source)

at java.awt.EventQueue.dispatchEventImpl(Unknown Source)

at java.awt.EventQueue.access$000(Unknown Source)

at java.awt.EventQueue$1.run(Unknown Source)

at java.awt.EventQueue$1.run(Unknown Source)

at java.security.AccessController.doPrivileged(Native Method)

我认为这就是堆栈跟踪:

java.lang.Exception: Stack trace

at java.lang.Thread.dumpStack(Unknown Source)

at frontend.fillOutputPane(frontend.java:385)

at page.concatPlates(page.java:105)

at backend.setPlate(backend.java:77)

at backend.fill(backend.java:257)

at frontend$openL.actionPerformed(frontend.java:191)

at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)

at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)

at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)

at javax.swing.DefaultButtonModel.setPressed(Unknown Source)

at javax.swing.AbstractButton.doClick(Unknown Source)

at javax.swing.plaf.basic.BasicMenuItemUI.doClick(Unknown Source)

at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(Unknown Source)

at java.awt.Component.processMouseEvent(Unknown Source)

at javax.swing.JComponent.processMouseEvent(Unknown Source)

at java.awt.Component.processEvent(Unknown Source)

at java.awt.Container.processEvent(Unknown Source)

at java.awt.Component.dispatchEventImpl(Unknown Source)

at java.awt.Container.dispatchEventImpl(Unknown Source)

at java.awt.Component.dispatchEvent(Unknown Source)

at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)

at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)

at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)

at java.awt.Container.dispatchEventImpl(Unknown Source)

at java.awt.Window.dispatchEventImpl(Unknown Source)

at java.awt.Component.dispatchEvent(Unknown Source)

at java.awt.EventQueue.dispatchEventImpl(Unknown Source)

at java.awt.EventQueue.access$000(Unknown Source)

at java.awt.EventQueue$1.run(Unknown Source)

at java.awt.EventQueue$1.run(Unknown Source)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)

at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)

at java.awt.EventQueue$2.run(Unknown Source)

at java.awt.EventQueue$2.run(Unknown Source)

at java.security.AccessController.doPrivileged(Native Method)

at java.security.AccessControlContext$1.doIntersectionPrivilege(Unknown Source)

at java.awt.EventQueue.dispatchEvent(Unknown Source)

at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)81240560

at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)

at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)

at java.awt.EventDispatchThread.pumpEvents(Unknown Source)

at java.awt.EventDispatchThread.pumpEvents(Unknown Source)

at java.awt.EventDispatchThread.run(Unknown Source)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值