Profiler, und was jetzt? :)

Status
Nicht offen für weitere Antworten.

Robinson

Mitglied
Hallo,

ich habe mal wieder etwas mit Java gespielt und bin dabei auf ein problem gestoßen.

Was ich geschrieben habe:

ein kleines Tool das über 8 Threads permanent Verschiedene funktionen prüft (E-Mail, Ordner einbinden,...)
Es soll mir später mal bei der Organisation meines Systems helfen.

Das Problem:

Von anfänglichen 35 MB schießt das Programm innerhalb einer Stunde auf 72 MB Arbeitsspeicherbedarf, laut Taskmanager.

Und das während weder eine Mail im Postfach noch irgendeiner der anderen Threads etwas tut.


Ich war mal wieder nicht dumm und habe mir einen Profiler (JProfiler) als Trial geladen.
Super Sache, nur was mache ich mit dem Ergebnis?

So hat sich der Speicher innerhalb der ersten sieben Minuten verändert.

profiler.jpg


Ich vermute das sagt alles erst mal garnicht viel.
Einen Link wo ich mich zu der Bedeutung dieser Zahlen einlesen kann wäre hilfreich.
 

Bleiglanz

Gesperrter Benutzer
Einen Link? der führt wahrscheinlich zum JProfiler :)

schau mal, ob deine Threads nicht versehentlich einen neue Strings erzeugen und diese in eine HashMap legen (als Key oder Value)

Maps sind immer gut, um Objektreferenzen da drin "zu vergessen" und auf diese Weise ein Speicherleck zu erzeugen...
 

Robinson

Mitglied
Das mit dem Link zum Profiler habe ich mir schon gedacht.

Habe scheinbar einen meiner hauptfehler schon gefunden:

Ich habe auf meinem JFrame 8 Labels.
wenn ein Thread aus dem sleep erwacht dann ruft er auf dem Frame eine Funktion wie diese auf:


Code:
	public void setMailReaderState(int i) {
		if (i == 0)
			labelMailReaderState.setIcon(new ImageIcon("images/stopped.png"));
		if (i == 1)
			labelMailReaderState.setIcon(new ImageIcon("images/active.png"));
		if (i == 2)
			labelMailReaderState.setIcon(new ImageIcon("images/working.png"));
		repaint();
	}

Habe die mal ausgeklammert und schon hält sich das Ganze im Rahmen!


Schaue jetzt weiter, Byte Arrays verwende ich auch nicht gerade viele, also mal schauen.
Hashmap habe ich glaube ich garkeine drin, nicht bewußt.

Ich suche weiter! ;)


Eins noch,

was ist das für eine Klasse java.lang.ref.Finalizer???
Wo gehört die hin?
Was macht die?
 

Illuvatar

Top Contributor
Robinson hat gesagt.:
Code:
	public void setMailReaderState(int i) {
		if (i == 0)
			labelMailReaderState.setIcon(new ImageIcon("images/stopped.png"));
		if (i == 1)
			labelMailReaderState.setIcon(new ImageIcon("images/active.png"));
		if (i == 2)
			labelMailReaderState.setIcon(new ImageIcon("images/working.png"));
		repaint();
	}

Du musst eben die Referenzen auf die Icons halten, und nicht jedesmal ein neues machen, dann geht das schon ;)

Generell eine gute Idee: einfach mal eine Volltextsuche nach "new" machen, und wo sich das verändern lässt, bzw. wo es in einer Schleife verwendet wird, möglichst wegmachen.
 

Robinson

Mitglied
Ich komme vorran.

Was im Moment übrig bleibtsind sehr viele WeakReferences Objekte.
Da ich diese nicht bewust verwende muss dies der Optimierer getan haben.

Wie finde ich raus wo er Weak Referenzen verwendet?
Wie vermeide ich dass er innerhalb einer Stunde 968 neue Referenzen erzeugt und nicht mehr frei gibt?
Die sollen ja angeblich kein Problem darstellen weil sie das unnötige Halten von Referenzen vermeiden.
Warum werden es aber immer mehr?

Müssten die nicht auch aufgelöst werden?

was auch noch bleibt sind jede menge hashmapentryiterator.
Eine HashMap nutze ich in diesem Code auch nicht!
 

MPW

Top Contributor
Hm, du schreibst was von mehreren Threads, haengen die von einander ab, sonst kannst du doch einfach mal ein paar auskuppeln und die einzeln auf den Speicherverbrauch pruefen...
 

Illuvatar

Top Contributor
Ich kenn mich mit dem Profiler da jetzt nicht aus, aber kann man sich net normal den stacktrace anschauen von der Stelle, an der die ganzen Objekte gemacht werden?
 

Robinson

Mitglied
OK,

ich habe zwar noch keine Vorstellung was mich da erwartet, aber das ist mal ein Ansatz.

Werde das mal schauen!
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben