StringBuilder out-of-memory-Fehler beim arbeiten mit großen strings in java
Ging ich aus String test += str;
wo test
wuchs exponentiell großen, mit tausenden von Zeichen. Es dauerte 45 Minuten zu laufen, wahrscheinlich von der Erstellung von großen strings und löschen von Müll. Ich habe dann taumelte der Eingabe wie diese, die brachte es auf 30 Sekunden.
Diese scheint, wie die Billig Weg, es zu tun, aber es funktionierte gut:
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 = "";
}
Habe ich dann entdeckt, dass StringBuilder
vorhanden ist, und ich habe versucht, es zu benutzen, da das ersetzen aller string-Operationen.
Das problem ist, dass ich immer ein java.lang.OutOfMemoryError
mit einem java-heap-Speicher-überlauf. Ich denke, dass der string einfach zu lang zum speichern im Speicher StringBuilder
- Objekt, denn es macht etwa 1/50th die Fortschritte, die meinen bisherigen code habe vor dem Absturz mit einer out of memory " - Fehlermeldung. Es ist nur die Arbeit mit vielleicht unter tausend Zeichen.
Warum kann eine Zeichenfolge halten Sie die gesamte Ausgabe, und dies kann nicht nahe kommen? Auch, wenn ich zum Anhängen von text JTextPane
, wie viel Speicher benötigt, brauchen? Wenn ich dump die StringBuilder
Inhalt JTextpane
und halten Anhängen und clearing StringBuilder
scheint das nicht zu funktionieren.
Hier ist der vorhandene code. Seite ist nur ein Objekt übergeben wird:
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);
}
}
Hier ist der Fehler:
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)
Ich denke, das ist, was ein stack-trace ist:
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)
Können Sie fügen Sie bitte den code, wo Sie die StringBuilder-Klasse. Ist der Fehler eher da zu sein.
Mehr details würden helfen. Ich bezweifle, dass der string im Speicher ist, damit Sie run out of memory. Hast du den stacktrace?
Ich rief Thread.dumpStack();. Ich bin ein noob, soweit erweiterte Codierung, ich nehme an, dies ist die Stapelüberwachung, die Drucke beim Aufruf dieser.
InformationsquelleAutor montag | 2011-12-02
Du musst angemeldet sein, um einen Kommentar abzugeben.
Anscheinend Ihre Anwendung doen nicht über genügend Arbeitsspeicher für den Vorgang abzuschließen. Daher müssen Sie angeben, Speicher-flags der virtuellen Maschine. Sie können versuchen, die folgenden:
Wo:
Das ist nicht als "quick fix" - je mehr Daten, die Sie aufbewahren möchten, im Speicher, desto mehr Speicher benötigen Sie.
Lediglich StringBuilder möglicherweise müssen Sie ein wenig mehr Speicher als ein einzelnes String-Objekt, wie es hält einige slots frei für neue Daten.
Ich bin ein Anfänger und dies ist meine kommerzielle Anwendung. Wo würden Sie den obigen code, wenn man in eclipse? Nur in der run-config in args?
Ja, in der Argumente-tab -> VM arguments
InformationsquelleAutor Ernesto Campohermoso
Sowie eines der Dinge, die passieren könnte, ist die Tatsache, dass in Java, Java.lang.String bekommt eine Besondere Behandlung. Strings sind unveränderlich, und somit die JVM Orte jedes String-Objekt in einen pool .Die Rolle dieses Pools, unter anderem ist die Tatsache, dass verwendet wird, als eine Art "cache", wo, wenn Sie erstellen Sie mehrere String-Instanzen mit dem eigentlichen "text" - Wert identisch ist, der gleichen Instanz wiederverwendet wird, die aus dem pool. Auf diese Weise schaffen, was scheint zu sein, eine große Zahl String-Objekt-Instanzen mit dem gleichen text innen werden in der Tat wieder sehr wenige tatsächliche String-Instanzen im Speicher. Auf der anderen Seite, wenn Sie die gleichen text zu initialisieren mehrere StringBuilder-Instanzen, die eigentlich separate Instanzen (mit dem gleichen text), und nimmt somit mehr Speicher.
Auf der anderen Seite, die Verkettung von Strings (wie
String c = "a"+"b";
) wird in der Tat schaffen mehr-Objekt-Instanzen, wenn Sie es mit StribgBuilder (wienew StringBuilder("a").append("b");
).Ich habe gerade gemerkt, dass es wohl weit über tausend Zeichen.
Können Sie das Debuggen mit Eclipse finden Sie heraus, wie lang der string wird?
Oder fügen Sie einfach einige-System.aus.println ' s, Ihnen zu sagen, wie lange die Saiten an verschiedenen stellen. Nicht sicher, was Ihr code tut, so kann nicht helfen, mehr als das. Viel Glück aber!
Ja, ich versuche das jetzt.
InformationsquelleAutor Shivan Dragon