StringBuffer habe ich soweit vor die Schleife gesetzt und die Länge auf 0 gesetzt! Die Klasse Label kommt von der API JExcel und in der Dokumentation steht, dass sie in der 2. Schleife stehen muss!
Im Debug habe ich mal genauer untersucht, wie JExcel überhaupt die sämtliche Daten sammelt und zwar werden die Spalten-Daten in den jeweiligen RowRecord-Array gespeichert! Das verbraucht wirklich viel zu viel Speicher und logischerweise kommt auch eine OutOfMemoryError.
1. Zeile: RowRecord[0][0] = Label(...)
RowRecord[0][1] = Label(...)
RowRecord[0][2] = Label(...)
RowRecord[0][3] = Label(...)
RowRecord[0][4] = Label(...)
usw. bis
25.000. Zeile: RowRecord[25000][0] = Label(...)
RowRecord[25000][1] = Label(...)
RowRecord[25000][2] = Label(...)
RowRecord[25000][3] = Label(...)
Ich weiss nicht, ob du die Klasse WeakHashMap kennst? Das wäre eine geniale Idee für mich, was mir eben eingefallen ist! Als Beispielcode:
Setzt mal bei der Zeile "System.out.println("25000");" einen Breakpoint und schau dir mal die Ausgabe an!
Das Programm läuft unendlich, da intern immer wieder aufgeräumt wird und die Objekte nicht länger verwendet werden. Die Map nimmt beispielweise 39 Elemente auf, davon werden dann 19 gelöscht und es sind nur noch 20 Elemente vorhanden und im nächsten Durchlauf werden noch mal weitere Objekte gelöscht. So stelle ich mir gerade für JExcel vor. Da kann der Speicherverbrauch nie überflüssig sein und es geht bestimmt auch viel schneller. Die Klasse "WeakHashMap" liegt in java.util.*; !
PHP:
int counter = 0;
WeakHashMap hm = new WeakHashMap();
while( true )
{
if( counter == 25000 )
System.out.println("25000");
hm.put( new Long( counter ), "test" + counter );
System.out.println( ( counter++ ) + ":" + hm.size() );
}
Gruß
Sebastian29