# CPU auslastung java.exe 25%



## radiac (4. Jan 2010)

Hallo Leute,


ich habe hier ein Problem mit Java. Und zwar sagt mir Java ständig, das es 25 % meiner CPU belastet, was ich ziemlich viel finde. Ist das normal wegen dem GC? Oder ist mein Programm wieder bescheuert programmiert???

Es geht wie immer um mein tolles Spiel .

Gibts dafür evt. eine performante Lösung??? Kann man den GC manuell steuern lassen mittlerweile???


Big Greetz Radiac


----------



## SlaterB (4. Jan 2010)

hast du einen oder 4 Kerne? bei 4 wären es quasi 100% Belastung, aber zum Glück nur auf einen der 4, oder?

GC ist bei einfachen Programmen kein Faktor oder wenn, dann auch nur weil das Programm soviel Arbeit erzeugt,
noch wahrscheinlicher ist aber irgendeine Dauerschleife im Programm selber


----------



## javimka (4. Jan 2010)

radiac hat gesagt.:


> Oder ist mein Programm wieder bescheuert programmiert???



Höchstwahrscheinlich schon 

Der GC muss nur dann arbeiten wie gestört, und 25% der CPU auslasten, wenn es soviel zu arbeiten gibt und das sollte der Programmierer verhindern. Grund könnte z.B. sein, dass eine häufig aufgerufene Methode jedesmal ein riesiges neues Objekt lokal erstellen muss, anstatt dass es als Membervariable geführt würde und somit immer auf die gleiche Referenz gespeichert wird.

Was ist es denn für ein Programm?


----------



## radiac (4. Jan 2010)

Hehe, okay.. dann liegt es nicht am GC.

Joa, leider hab ich einen 4 Kern Prozessor .

Das Problem ist, dass es sich bei dem Programm um einen Server handelt. Und der braucht ja immer eine dauerschleife zum überprüfen von Positionen und so... aber ich werd mal schauen ob ich da was an CPU einsparen kann....

Und mal eine ganz doofe Frage...

Kennt irgend einer von euch eine einschlägige Literatur oder Tutorial für einen GameServer???
Es gibt ja absolut garnichts im Welt Weiten Witz...

Am besten speziell für Java.
Sinnvoll wäre da natürlich das nicht das ganze Standartzeug drin steht wie ein simpler Server / Client Chat sondern schon etwas komplexer.

Aber vermutlich sind da schon viele dran gescheitert... naja schau ich mal 

:rtfm:


Nachtrag:

Also von den 4 Kernen haben 1 und 2 = 50 % Auslastung und 3 = 30 % und 4 = 20 % ca...

Also schon ziemlich besch..... .


----------



## homer65 (4. Jan 2010)

Du kannst eine Profiler wie zB JRAT benutzen um das Problem einzugrenzen:
JRat the Java Runtime Analysis Toolkit


----------



## eRaaaa (4. Jan 2010)

radiac hat gesagt.:


> Und der braucht ja immer eine dauerschleife zum überprüfen von Positionen und so


Schreib da zwischendurch einfach mal ein kurzes Thread.sleep(..); rein von einigen ms..


----------



## radiac (4. Jan 2010)

Wow alles gute Tipps  xD


Denn Thread.sleep hatte ich rausgenommen auf grund syncronisationsprobs und abstürtze mit dem CLient . Okay werde das alles mal Checken.

@ Homer, werd mir das mal anschauen.


Danke danke... weitere Tipps sind erwünscht .

Manchmal braucht man ein 4 Kern Gehirn um sich alles zu merken was man alles mal abgeändert hat .


----------



## javimka (4. Jan 2010)

jedenfalls solltest du keine ungebremste Schleifen laufen lassen. ist ja klar, dass die dann alles aufbrauchen. Wenn du 4 Kerne hast und dein Programm verwendet nur einen davon, würde ich mal das Schlagwort "Mutlithreating" in den Raum werfen. Du könntest einen Thread machen, der auf einkommende Anfragen/Jobs (was auch immer) hört (z.B. 10 oder 100 Mal pro Sekunde) und dann neue Threads startet, die diese Anfragen bearbeiten.


----------



## faetzminator (11. Jan 2010)

[c]Thread.sleep()[/c] ist in dem Fall nicht sehr schön. Verwende lieber Thread (Java Platform SE 6).


----------



## Empire Phoenix (11. Jan 2010)

Thread.yield()

Oder eine feste tickrate einführen


```
Thread updatethread = new Thread(){
				public void run(){
					while(true){
						long start = System.currentTimeMillis();
						solarsys.Update();
						long end = System.currentTimeMillis();
						int timepertick = (int) (end-start);
						int sleeptime = NHGlobals.ServerTickTime - timepertick;
						if(sleeptime > 0){
							try {
								Thread.sleep(NHGlobals.ServerTickTime - timepertick);
							} catch (InterruptedException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
						}
						
					}
				}
			};
			updatethread.setName("SolarSystem " + mapx + "-" + mapy);
			updatethread.start();
```


----------



## Spacerat (11. Jan 2010)

Wieso sollte ein GameServer eine "Busy-Waiting"-Schleife benötigen? Genügt es nicht, wenn er per [c]ServerSocket[/c] und mittels [c]accept()[/c] auf eingehende Verbindungen wartet, diese Verbindungen an einzelne Threads weiterleitet, die schliesslich den Spielstand beeinflussen?
Für dauerhafte Client-Server-Verbindungen könnten auch [c]PipedIOStreams[/c] auf beiden Seiten dieses Problem lösen. Hauptsache ist doch, man hat irgendwo ein oder zwei "blockierende" Methoden.
BTW.: Mir ist gerade iwie das Gegenteil von Busy- bzw. Active-Waiting entfallen... Dafür gab's doch auch 'nen Fachausdruck? Naja... kann ich, wenn nötig, auch wieder herbei-googlen.


----------



## EgonOlsen (11. Jan 2010)

Thread.yield() gibt nur anderen Threads die Chance zu laufen. Es hilft nicht, um die Last zu verringern, sondern sorgt nur für eine "gerechtere" Verteilung zwischen Threads.

| Robombs hat ein relativ einfaches, spielunabhängiges Client-/Serverframework. Die Quellen sind hier: http://jpct.de/download/robombs_src.zip 
Vielleicht hilft das irgendwie...


----------



## Empire Phoenix (11. Jan 2010)

Feste tickrate hat aber einige vorteile, je nach spielart:

-> Determinismus
-> Einfacherer Berechnungen (man kann sich den ganzen delta kram sparen)


----------



## faetzminator (11. Jan 2010)

EgonOlsen hat gesagt.:


> Thread.yield() gibt nur anderen Threads die Chance zu laufen. Es hilft nicht, um die Last zu verringern, sondern sorgt nur für eine "gerechtere" Verteilung zwischen Threads.


Genügt aber normalerweise, dass die CPU nicht voll ausgelastet ist


----------



## EgonOlsen (12. Jan 2010)

faetzminator hat gesagt.:


> Genügt aber normalerweise, dass die CPU nicht voll ausgelastet ist


Nein, tut es nicht. Es ändert an der Auslastung an sich gar nichts.Beispiel:


```
public class Yield
{
  public static void main(String[] args)
  {
    long s = System.currentTimeMillis();
    do
    {
      Thread.yield();
    }
    while (System.currentTimeMillis() - s < 10000);
  }
}
```

Damit lastest du einen Kern 10sek für 100% aus. yield() hin oder her.


----------



## Empire Phoenix (12. Jan 2010)

Deswegen ja die feste ticktime, Thread.yield hilft aber das zumindest andere programme threads noch zum zug kommen ^^, wobei bei nem quad core isses eh net so wichtig.

irklich senken kann man das nur indem man 
a)feste ticktimes nimmt (alles was eine progressive welt hat,rennspiele zb, der client sollte sich hier mit seiner geschwindigkei bewegen können ^^)
b)den server eventbasiert laufen lässt (vieles mmorpg artige (aktives target auf id 500 legen, zauber2 benutzen(der wartet mithilfe von timer paar sekunden und löst dann aus)))


----------

