Heap-Speicher der JVM wird gesprengt

Korn-flake

Grünschnabel
Hallo Forum Mitglieder!:)
Ich habe folgendes Problem !
Also ich erstelle eine Wahrheitstabelle ( ein 2dimensionales Array ). Man kann im Konstruktor die Länge der ersten Dimension übergeben. und eine Methode berechnet die Länge der 2 dimension( A(x) = 2^n ).

public TruthTable(int length){
tableArray = new String[ length ][ calculateExpLinear( length ) ];
}

public static int amount ;

public static int calculateExpLinear( int length1 ){
amount = 1;
for (int i = 0; i < length1; i++) {
amount *= 2 ;
}
return amount;
}
So jetzt ist das Problem,dass bei einer Tabellengröße ab 2^20 ich die Fehlermeldung ausgegeben bekomme "java.lang.OutOfMemoryError: Java heap space" at WerteT.LookUpTable.<init>(LookUpTable.java:19) -> wo die Parameter im Konstruktor übergeben werden!

Meine Ideen:
Zu erst dachte ich es liegt an meiner rekursiven Berechnung,deshalb war ich noch verwunderter,als ich dies Lineare-Methode schrieb und er immer noch den Fehler ausgab. Ich weiß eigentlich garnicht warum er so viel speicher benötigt :confused:!

Im i-net fand ich dne Hinweis,dass man irgendwo mehr speicher zur Verfügung stellen kann.
Aber geht das Problem nicht auch anders zu beheben ?
Bzw falls es keine andere Lösung gibt,kann mir jemand erklären wie das mit der Speicherfreigabe( unter Netbeans) funktioniert? Aber eine andere Lösung wäre mit lieber!

gruß Korn-flake :)
 
Schau mal, ob du irgendwo versehendlich eine rießige Menge Instancen instanzierst. 2^20 sind nur knapp ein Megabyte.

btw.

[j a v a]
[/ j a v a]
 
Danke für deine schnelle Antwort!:)

Also in meiner Main- Methode rufe ich den Kostruktor auf
TruthTable tT = new TruthTable(20); <- hier wird auch der fehler erzeugt .

(ob steht ja der Kostruktor)
es wird eigentlich nur die länge berechnet (siehe Methode calculateExpLinear).

mehr mache ich nicht !

ansich frag ich mich ja,was den fehler auslöst die paar 2en die er ausrechnen soll werden ihn doch nciht so belasten können.

gruß Hannes
 
Mit den parameter Xms (Startgröße der VM) und Xmx (Maximalgröße der VM) kannst du den Speicher erweitern.

Beispiel:
Code:
-Xms256m -Xmx512m
Die VM startet mit einer größe von 256mb und wird maxiaml 512mb groß, darüber wird dann die von dir beschrieben Exception geworfen.
 
Zuletzt bearbeitet:
Hi,

Dein String Array mit der Länge 20 Verbraucht schon 80Megabyte alleine (20 für die erste Dimension X 2^20 für die zweite Dimension X 4Byte für jede Stringreferenz) das sollte aber deinen Heap wahrscheinlich noch nicht sprengen. Dazu kommen jedoch noch deine Millionen Strings sobald die allokiert werden, und alle Berechnungen die du danach damit veranstaltest.
So fern das Array nur die Wahrheitswerte enthält würde ich Boolean als Datentyp verwenden.

Ich tippe darauf, dass dein Fehler weiter hinten liegt.

Poste doch einfach mal die Crash Meldung.

MfG

Andibert

P.S. Nutze in Zukunft die Java Tags, das macht es uns einfacher zu helfen.
P.P.S. Andere waren natürlich mal wieder schneller. Die komplette Stacktrace würde ich aber trotzdem gern sehen.
 
Zuletzt bearbeitet:
Schau mal, ob du irgendwo versehendlich eine rießige Menge Instancen instanzierst. 2^20 sind nur knapp ein Megabyte.
Wenn man genauer hinschaut, sieht man, dass hier ein Array aus 20*2^20 Referezen auf Strings angelegt wird. Angenommen ein solcher Verweis benötigt 4 Bytes, dann wären das schon 80 MiB, was über der Standard-Grenze von 64 MiB für den JVM-Heap liegt.

@Korn-flake: Also entweder du startest die JVM wie von Johannes7146 beschrieben oder du überlegst dir erst mal, ob für eine Wahrheitstabelle der Typ boolean nicht geeigneter wäre als String

\edit: Mist, zu langsam :-(

Grüße,
Matthias
 
Moin,

Du erzeugst also
Java:
tableArray = new String[20][2^20];
// oder genauer
tableArray = new String[20][1048576];

was dann lustige 20.971.520 Speicherplätze ergibt!
Das ist schon 'ne ganze Menge ;-]

Und je nachdem, womit Du die Plätze dann füllst .......

Hast Du mal versucht, den Speicher mit -XmsXXXm -XmxYYYm zu erweitern ?

Gruß
Klaus

EDIT: oops, noch langsamer :-(
 
Java:
package de.tutorials.johannes7146;

public class MemTest {
	
	public static void main(String[] args) {
		MemTest memTest = new MemTest();
		System.out.println("ENDE");
		System.exit(0);
	}
	
	public MemTest() {
		int dim1 = 20;
		int dim2 =  calculateExpLinear(dim1);
		System.out.println("Dim1: "+dim1);
		System.out.println("Dim2: "+dim2);
		
		//4 Byte pro Strgreferenz
		int speicherBelegung = 4;
		
		double memory = (dim1*dim2*speicherBelegung);
		System.out.println("genutzer Speicher: "+memory+" byte");
		System.out.println("genutzer Speicher: "+memory/1000+" KiloByte");
		System.out.println("genutzer Speicher: "+memory/1000/1000+" MegaByte");
		
		String[][] tableArray = new String[dim1][dim2];
	}

	public static int amount;

	public static int calculateExpLinear(int length1) {
		amount = 1;
		for (int i = 0; i < length1; i++) {
			amount *= 2;
		}
		return amount;
	}
}

Einfach mal mit der Größe von dim1 herumspielen dann siehst du wie Groß das ganze schnell werden kann.
 
Danke für eure Antworten ,ihr seid ja echt Fix :):):)

Öhhm ich probiere gerade den Speicher zu erhöhen .....

aber irgendwie hab ichgerade ein Benutzerproblem / bzw Verständnisproblem ^^
wie starte ich denn manuell die VM ?:confused:
hab alle Programme aus den StartUp draußen und bin gerade auf der suche die VM zustarten(und im Tray ist dieses JAva symbol auch nicht,welches ja die VW oder? ),
// Irgendwie sehe ich den wald nicht ! xD

Danke für den Tipp mit den Boolean-array,wird meine implementierung sehr erschweren ,aber wenn dadurchd er Fehler behoben werden kann isses akzeptabel
 

Neue Beiträge

Zurück