Hallo,
ich habe ein "großes" Problem.
Der Normalfall eines Threads ist doch:
er entsteht, arbeitet seinen Dienst ab, und stirbt danach. So wie es sich gehört.
Aber der liebe Herr Thread möchte bei mir nicht sterben.
Ich hoffe ich kann euch das Problem halbwegs gut erklärt schildern.
Ich habe eine Klasse Ping, welche von Thread erbt.
In der run() Methode von Ping befindet sich eine Endlosschleife, in der immer wieder ein Teil meiner SW "angepingt" wird.
Das Problem ist, dass der Arbeitsspeicherverbrauch meines Programms von anfänglichen 50MB unter Linux auf 400MB ansteigt (nach ca. 3min), unter Windows verdoppelt sich der Speicherverbrauch von 30MB auf 60MB. Es sei mal so dahingestellt dass Windows weniger verbraucht ;-). Die CPU-Auslastung beträgt dann 97%~100%.
Ich habe in meinem Programmcode einen activeCount() in einem System.out.pritntln, damit mir angezeigt wird, wieviele Threads existieren. Es werden immer mehr, bei jedem Schleifendurchlauf steigt die Anzahl um einen. Bei ca. 140 Threads kommen die 97% CPU-Auslastung zum Vorschein.
In der Schleife werden Klassen aufgerufen bzw. Methoden, die auch Threads enthalten (die Klassen bauen Verbindung zum Telnet auf, ich hab sie nicht selber programmiert, kenne sie also nur grob).
Jedenfalls ist es so, dass wenn ich bestimmte Objekte (von dem Telnet.. Code) auskommentiere, der activeCount() nicht ansteigt!
Bevor ich den Code jetzt poste. Es kann doch im Endeffekt nur daran liegen, dass die von mir auskommentierten Objekte, irgendwelche Threads erzeugen und diese Threads nicht sterben.
Oder?
Es geht eigentlich um das Prinzip, ich denke nämlich nicht, dass ihr besonders schlau werden könnt aus diesem Code.
Wäre euch dankbar wenn Ihr mir helfen könntet.
ich habe ein "großes" Problem.
Der Normalfall eines Threads ist doch:
er entsteht, arbeitet seinen Dienst ab, und stirbt danach. So wie es sich gehört.
Aber der liebe Herr Thread möchte bei mir nicht sterben.
Ich hoffe ich kann euch das Problem halbwegs gut erklärt schildern.
Ich habe eine Klasse Ping, welche von Thread erbt.
In der run() Methode von Ping befindet sich eine Endlosschleife, in der immer wieder ein Teil meiner SW "angepingt" wird.
Das Problem ist, dass der Arbeitsspeicherverbrauch meines Programms von anfänglichen 50MB unter Linux auf 400MB ansteigt (nach ca. 3min), unter Windows verdoppelt sich der Speicherverbrauch von 30MB auf 60MB. Es sei mal so dahingestellt dass Windows weniger verbraucht ;-). Die CPU-Auslastung beträgt dann 97%~100%.
Ich habe in meinem Programmcode einen activeCount() in einem System.out.pritntln, damit mir angezeigt wird, wieviele Threads existieren. Es werden immer mehr, bei jedem Schleifendurchlauf steigt die Anzahl um einen. Bei ca. 140 Threads kommen die 97% CPU-Auslastung zum Vorschein.
In der Schleife werden Klassen aufgerufen bzw. Methoden, die auch Threads enthalten (die Klassen bauen Verbindung zum Telnet auf, ich hab sie nicht selber programmiert, kenne sie also nur grob).
Jedenfalls ist es so, dass wenn ich bestimmte Objekte (von dem Telnet.. Code) auskommentiere, der activeCount() nicht ansteigt!
Bevor ich den Code jetzt poste. Es kann doch im Endeffekt nur daran liegen, dass die von mir auskommentierten Objekte, irgendwelche Threads erzeugen und diese Threads nicht sterben.
Oder?
Es geht eigentlich um das Prinzip, ich denke nämlich nicht, dass ihr besonders schlau werden könnt aus diesem Code.
Java:
class Ping extends Thread {
java.beans.PropertyChangeSupport propChange = new java.beans.PropertyChangeSupport(this);
Fehlerdiagnose fehlerdiagnose;
static Client routerTest = new Client(5, 5);
int internR = 0;
public Ping(Fehlerdiagnose fd) {
this.fehlerdiagnose = fd;
}
@Override
public void run() {
while (internR == 0) {
boolean pingInternet; //Ping
System.out.println(activeCount());
try {
try {
Thread.sleep(2000);
internR = fehlerdiagnose.da.w.internI;
} catch (InterruptedException ex) {
// Logger.getLogger(runPing2.class.getName()).log(Level.SEVERE, null, ex);
}
pingInternet = Ping.ping("test");
propChange.firePropertyChange("pingInternet", !pingInternet, pingInternet);
} catch (IOException ex) {
Logger.getLogger(runPing2.class.getName()).log(Level.SEVERE, null, ex);
}
boolean pingAntenne;
try {
routerTest.connect(Properties.std_ip); // wenn ich das hier auskommentiere
try {
Fehlerdiagnose.Router = routerTest.isRouter(); // und das hier, gibt es keine Probleme
} catch (TimeoutException ex) {
Fehlerdiagnose.Router = false;
}
} catch (SocketException en) {
// Logger.getLogger(Fehlerdiagnose.class.getName()).log(Level.SEVERE, null, en);
Fehlerdiagnose.Router = false;
} catch (IOException e) {
//Logger.getLogger(Fehlerdiagnose.class.getName()).log(Level.SEVERE, null, e);
Fehlerdiagnose.Router = false;
}
try {
pingAntenne = Ping.ping(Properties.std_ip);
propChange.firePropertyChange("pingAntenne", !pingAntenne, pingAntenne);
} catch (IOException ex) {
Logger.getLogger(runPing2.class.getName()).log(Level.SEVERE, null, ex);
}
internR = fehlerdiagnose.da.w.internI;
if (internR == 1) {
routerTest = null;
}
}
}
public void addPropertyChangeListener(java.beans.PropertyChangeListener listener) {
propChange.addPropertyChangeListener(listener);
}
public void removePropertyChangeListener(java.beans.PropertyChangeListener listener) {
propChange.addPropertyChangeListener(listener);
}
}
Wäre euch dankbar wenn Ihr mir helfen könntet.
Zuletzt bearbeitet: