# java.lang.OutOfMemoryError: Java heap space



## lunatikz (6. Aug 2012)

Hi,

ich hab hier ein äußerst merkwürdiges problem...
ich hab eine relativ speicherintensive anwendung geschrieben...
auf meinem laptop verwende ich linux (64bit) und hab ca 4gb ram, und nutze eclipse mit folgenden args xms= 40, xmx=512mb (eclipse indigo)
Auf meinem laptop läuft das programm wunderbar,...aber nicht auf meinem standrechner..(win xp sp 3, 2gb ram, eclipse (juno) vmargs: xms:40, xmx: 1024 (!), 32 bit system). hier bricht es mit o.g. fehler ab..  
auf beiden rechnern ist das jdk 1.7 von oracle installiert. 
wie kann sowas sein ? an sich müsste es doch auch auf meinem rechner laufen.. tut es aber nicht.. der heap status (in eclipse) zeigt auch nicht an, dass der speicher voll ist. 
aufgrund der verschiedenen cpu plattformen (32 bit / 64 bit) ist natürlich die entsprechende jdk version installiert.. könnte dies einen einfluss darauf haben ? 
hat jemand vielleicht eine idee, woran es sonst liegen könnte ? 
der code ist natürlich auf beiden rechnern zu 100% identisch..

Grüße,
luna


----------



## timbeau (6. Aug 2012)

1024? Oder 1024M?

Evtl sind da irgendwelche CodeReste? Mal Eclipse mit -clean starten. Was sagt der StackTrace genau?


----------



## lunatikz (6. Aug 2012)

1024M 

stacktrace: 
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
	at java.util.Arrays.copyOf(Unknown Source)
	at java.util.Arrays.copyOf(Unknown Source)
	at java.util.ArrayList.grow(Unknown Source)
	at java.util.ArrayList.ensureCapacityInternal(Unknown Source)
	at java.util.ArrayList.add(Unknown Source)
	at de.mopr.cvm.alogicminimizer.core.algorithm.alogicdnfminimizer.ALogicAlgebraicDNFMinimizer.idempotent(ALogicAlgebraicDNFMinimizer.java:687)
	at de.mopr.cvm.alogicminimizer.core.algorithm.alogicdnfminimizer.ALogicAlgebraicDNFMinimizer.appIdem(ALogicAlgebraicDNFMinimizer.java:653)
	at de.mopr.cvm.alogicminimizer.core.algorithm.alogicdnfminimizer.ALogicAlgebraicDNFMinimizer.applyRules(ALogicAlgebraicDNFMinimizer.java:344)
	at de.mopr.cvm.alogicminimizer.core.algorithm.alogicdnfminimizer.ALogicAlgebraicDNFMinimizer.getDNF(ALogicAlgebraicDNFMinimizer.java:70)
	at de.mopr.cvm.alogicminimizer.core.ALogicMinimizerControl.getCMF(ALogicMinimizerControl.java:64)
	at alogicminimizertest.Main.minimize(Main.java:202)
	at alogicminimizertest.Main.main(Main.java:169)

das eclipse war frisch gezogen, und neu installiert...
allerdings hatte ich den workspace einfach vom laptop auf den rechner kopiert. aber das dafür nicht relevant oder ?


----------



## tribalup (6. Aug 2012)

Wäre gut wenn du ein bissen code posten könntest.


----------



## maki (6. Aug 2012)

Ein neuer Workspace ist IMHO Pflicht.


----------



## lunatikz (6. Aug 2012)

das wird schon schwieriger, weils relativ viel code ist.. aber hier mal ein auszug welcher den fehler produziert...

```
private ArrayList<ALiteral> idempotent(ArrayList<ALiteral> tmp) {
		ArrayList<ALiteral> result = new ArrayList<ALiteral>(); 
		for (int i = 0; i < tmp.size(); i++) {
			ALiteral lit = tmp.get(i);
			for (int j = i; j < tmp.size(); j++) {
				ALiteral lit1 = tmp.get(j);
				if (lit != lit1) {
					// checking if literals without negation are the same 
					if (lit.getProperLiteral().equals(lit1.getProperLiteral())) {
						result.add(lit1.clone());
						//return result;	
					}
					//if one literal is negated and the other one isnt negated
					else  if (lit.getName().equals(lit1.getName())){
						result.add(new ALiteral("FALSE", false));
					//	return result;	
					}	
					// if lit is a true constant
					else if (lit.getProperLiteral().equals("TRUE") || lit.getProperLiteral().equals("!FALSE")) 
						result.add(lit1.clone());
					else if (lit1.getProperLiteral().equals("TRUE") || lit1.getProperLiteral().equals("!FALSE")) 
						result.add(lit.clone());
					else if (lit.getProperLiteral().equals("FALSE") || lit.getProperLiteral().equals("!TRUE")) 
						result.add(new ALiteral("FALSE", false));
					else if (lit1.getProperLiteral().equals("FALSE") || lit1.getProperLiteral().equals("!TRUE")) 
						result.add(new ALiteral("FALSE", false));
				}
				
			}
			
		}
		return result;
	}
```

die verwendung von clone() ist beabsichtigt.. also mir is schon klar dass es relativ inperformant ist.. was ich bloss nicht verstehe, ist die tatsache, dass es auf der einen kiste funktioniert, und auf der anderen nicht, obwohl der rechner auf den es nicht funktioniert mehr heap speicher hat...


----------



## tribalup (6. Aug 2012)

Könnte es sein das tmp zu groß wird?


----------



## lunatikz (6. Aug 2012)

@tribalup: nein, das denke ich weniger... im schnitt sind ca 50- 100 elemente drin..
@maki: ok, das probier ich ma fix


----------



## lunatikz (6. Aug 2012)

@maki: also das mit dem exportieren und neu importieren hat nicht funktioniert.


----------



## maki (6. Aug 2012)

Exportieren/Importieren?
Nicht funktioniert?

Vielleicht ein bisschen spezifischer


----------



## lunatikz (6. Aug 2012)

na ja, du meintest doch nen neuen workspace erzeugen, exportieren des projekts und dann in den neuen workspace importieren oder? 
wie auch immer,.. ich hab die lösung...
das problem ist tatsächlich die unterschiedliche cpu plattform und die java version (32bit/64bit).
das 32 bit jdk gibt per default nur eine fixe größe des heapspace. das 64 bit jdk vergibt in abhängigkeit des tatsächlich vorhandenen rams.
umgehen kann man dies im 32 bit system, durch explizites setzen der vm args in den run configurtions.. ich hatte dies zuvor nur in der eclipse.ini definiert. was aber wohl scheinbar ein unterschied ist. 
aber vielen dank für eure hilfe


----------

