Aufgabe 4.5c)

OutOfMemoryError (gelöst)

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

Aufgabe 4.5c)
Hallo,
nachdem ich jetzt nach meiner 7. Implementierung zur Aufgabe 4.5c) immer noch einen “java.lang.OutOfMemoryError: Java heap space” erhalte, wenn ich meinen Code ausführe, würde ich gerne wissen, ob es bei den 3000000 vorgegebenen Funktionen überhaupt Punktabzug gibt, wenn innerhalb der Klasse “java.util.concurrent.ThreadPoolExecutor” (Teil von ExecutorService) ein solcher Fehler auftritt.

MfG
phi


Also bei mir läuft das auch noch mit mehr ohne Mecker bei Eclipsestandardeinstellungen


Ich verwende kein Eclipse, stattdessen führe ich das ganze direkt über java.exe aus. Kann es sein, dass Eclipse die Standardeinstellung für die größe des Heaps ändert? Ich denke, mein Code überfordert den ExecutorService mit den ganzen Callables, aber dass ist sogar dann der Fall, wenn maximal 8 Callables zur gleichen Zeit laufen.


Moeglich, Eclipse benutzt ja normalerweise auch einen anderen als den Standard-Java-Compiler und -Linker.

und eclipse.ini sagt zB hier ne handvoll Parameter, die sich auf jeden Fall das Eclipse selber setzt:

--launcher.defaultAction
openFile
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
256m
--launcher.defaultAction
openFile
-vmargs
-Dosgi.requiredJavaVersion=1.6
-XX:MaxPermSize=256m
-Xms40m
-Xmx384m

Was passiert wenn du deinen Heapspace mit -Xmx2048m erhöhst?
Wenn du nicht in deiner Implementierung das 1000-fache an benötigten Objekten erzeugst, sondern der Fehler an Java/Hardware/HeapSpace etc. liegt, gibt es keinen Punktabzug :wink:


Dann meckert Java trotz fast 3GB unbenutztem RAM (laut TaskManager; Windows7 x64) rum:

Error occurred during initialization of VM
Could not reserve enough space for object heap
Could not create the Java virtual machine.

EDIT:
Mit 1GB funktioniert das ganze endlich.


kann mir mal jemand erklären, wie 4 Threads die 3000000 Nullstellen berechnen sollen? So wie ich verstanden habe, soll ja für jede Nullstelle ein Callcable Objekt erstellt werden und wenn ich keine Warteschlange verwende, bräuchte ich ja 3000000 Threads 0o


nein 4 Threads arbeiten dass einfach nacheinander ab


aber dann brauch ich doch ne Warteschleife, oder? Weil wenn ich X Callable Objekte per submit an den Executorservice gebe, hängt er sich auf, wenn zu wenig Threads verfügbar sind. Wo ist der Trick dabei? :smiley:


Wieso sollte er sich aufhängen? Der verwaltet das selber


ok, nachdem ich das Speichern des Rückgabewertes entfernt habe, läuft er zwar durch, aber erzeugt nur 4 Callable Objekte 0o


Die Callables erzeugst du doch irgendwo?! Da liegt dann wohl dein Fehler… :huh:


ExecutorService e = Executors.newFixedThreadPool(nThreads);

	for(int i=0;i<laenge;i++){
		e.submit(new T_findRoots2(i,f,left,right,rootFinder));	
	}
e.shutdownNow();

so schauts aus


Welchen Wert hat denn laenge und ist es gewollt, dass du die Future Objekte nicht speicherst?


laenge entspricht der Größe von count aus der Mainfunktion, ja wenn ich die Futureobjekte speichern will, dann hängt er. Das funktioniert nur wenn laenge<=nThreads ist :\

		int laenge = f.length;
		Double[] threadedRoots = new Double[laenge];
		ArrayList<Future<Double>> roots = new ArrayList<Future<Double>>();
		
		ExecutorService e = Executors.newFixedThreadPool(nThreads);
		
		for(int i=0;i<laenge;i++){
			roots.add(e.submit(new T_findRoots2(i,f,left,right,rootFinder)));	
		}
		e.shutdownNow();
	
		for(int j=0;j<roots.size();j++)
			try {
				threadedRoots[j]=roots.get(j).get();
			} catch (InterruptedException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			} catch (ExecutionException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		
		return threadedRoots;

Lies dir mal die Dokumentation zu shutdownNow() durch!


argh xD jetzt gehts


achja bei 3000000 erhalte ich auch “Exception in thread “main” java.lang.OutOfMemoryError: Java heap space” naja mir egal jetzt xD