CPU 100% und ruckeln ?!?!?

huckleberry

Bekanntes Mitglied
Hallo Leute.

Ich habe ein kleines Problem. Mein Programm brauch nun 6 mal so lange und CPU schiesst rauf auf 100%. Es "ruckelt" dann auch. Vorher war das nicht so? Ich habe auch nur Kleinigkeiten (hier und da mal eine ausgabe auf Datei), wüsste jetzt auch nicht konkret woran das liegt?

Es sind knapp 20 Applikationen,welche wiederum jeweils 2 eine Datei beschreiben. Kann das sein, dass es zuviele Dateihandler gibt?

Edit: Durchschnittlich von 4GB RAM nur 1,5GB insgesamt belegt.

Mein Problem: Die Hauptjars sind ohne debuginfos kompiliert und ich kann somit nicht debuggen.

Dankbar für jede Hilfe.
 
Zuletzt bearbeitet:

OliverKroll

Aktives Mitglied
Es kann immer viele Gründe geben. Mir passiert so etwas manchmal auch. Bei mir liegt es daran, daß ich ein Notebook mit kleinem Lüfter habe. Wenn bei starker Belastung (viele Rechenoperationen) die Leistung des Lüfters nicht mehr ausreicht, dann wird die Leistung der CPU ungefähr auf 10 Prozent gesenkt. Danach hilft nur noch ausschalten und 5 Minuten lang abkühlen lassen. Auch alle anderen Programme sind dann verlangsamt. Vielleicht liegt es bei dir ja auch nur daran.
 

OliverKroll

Aktives Mitglied
Ferndiagnose ist immer sehr schwer. Am besten ist es, wenn du das Problem eingrenzen kannst auf wenige Klassen oder sogar eine Testklasse, und die dann hier veröffentlichst. Ohne Programmtext wirst du sonst vermutlich auch nach Stunden keine detaillierten Vorschläge bekommen können. ;)
 

huckleberry

Bekanntes Mitglied

Nicer

Bekanntes Mitglied
hm , irgendwelche würmer viren oder sonstwas wäre natürlich auch ne möglichkeit , immoment geht einer über ICQ rum , der schreibt die ganze zeit mails iwo hin , der saugt viel speicher

ansonsten : iwas an der hardware / OS geändert ?
 

huckleberry

Bekanntes Mitglied
ICQ benutz ich net. Eclipse im leerlauf hat 481MB und verdoppelt sich knapp. Ich richte mal eclipse neu ein und schau mir gleich mein Code nochmal an. Wenn doch nur der Debugger gehen würde :S
 

Thief

Bekanntes Mitglied
100% Auslastung klingt nach einer Endlosschleife ohne kurze Pausen. Kann es sein dass du sowas mal eingebaut hast? Falls ja, bau ne kleine Thread.sleep() ein, und wenn es nur 2 ms sind, reichts schon aus um die CPU Last wieder runter zu kriegen.
 
A

Anarkus

Gast
hi,
du hattest gesagt du hast 20 Programe die in dateien schreiben.
gibt es vielleicht Deadlocks? das ein Programm gerade schreiben will während das andere schon schreibt ??entstehen vielelciht Zombi Prozesse oder Threads die einfach nciht zurück kommen?
Verwendest du Semaphore die vielleicht nicht mehr freigegeben werden oder ähnliches???

ich denke das das auch jeweils die CPU auf 100% treiben kann
 
G

Gelöschtes Mitglied 5909

Gast
ohne klare beschreibung oder mehr infos wird hier jeder nur raten können.
Gleicht der Suche der Nadel im Heuhaufen und eine Glaskugel ham wir leider auch nicht.

Was für eine Antwort erwartest du?
 
Zuletzt bearbeitet von einem Moderator:

Nicer

Bekanntes Mitglied
mach halt mal den debugger an und schau ab wo genau die CPU leistung so nach oben schiesst , dann hastu wenigstens schonmal der punkt wo es passiert
 

huckleberry

Bekanntes Mitglied
du hattest gesagt du hast 20 Programe die in dateien schreiben.
gibt es vielleicht Deadlocks? das ein Programm gerade schreiben will während das andere schon schreibt ??entstehen vielelciht Zombi Prozesse oder Threads die einfach nciht zurück kommen?
Verwendest du Semaphore die vielleicht nicht mehr freigegeben werden oder ähnliches???

ich denke das das auch jeweils die CPU auf 100% treiben kann

DAS klingt interessant! Ja den Teil schau ichmir mal genauer an.
Es sind mehrere Instanzen meiner jar, welche von der Hauptjar erstellt werden. Diese haben versch. Ids und Werte etc. aber laufen parallel.
 

huckleberry

Bekanntes Mitglied
warum geht denn der debugger bei dir nich ? bei mir funtzt der einwandfrei

An sich funzt der Debugger auch, jedoch sind die Hauptjars (insbesondere ist die void main() dort enthalten ) leider leider nicht von mir, nicht opensource und vorallem nicht mit dem debug Flag (so kenn ich es aus der C/C++ Welt) compiled.
Weiterhin bringe ich es NICHT per grünen Pfeil, sondern per shellscript zum Laufen. Dieses shellscript rufe ich per "Run As.." auf, welches ich unter "External Tool Configurations" definiert habe.
 
Zuletzt bearbeitet:

Nicer

Bekanntes Mitglied
An sich funzt der Debugger auch, jedoch sind die Hauptjars (insbesondere ist die void main() dort enthalten ) leider leider nicht von mir, nicht opensource und vorallem nicht mit dem debug Flag (so kenn ich es aus der C/C++ Welt) compiled.
Weiterhin bringe ich es NICHT per grünen Pfeil, sondern per shellscript zum Laufen. Dieses shellscript rufe ich per "Run As.." auf, welches ich unter "External Tool Configurations" definiert habe.

Aha oke ^^ dann isch das natürlich was andres :)
 
M

maki

Gast
Blockierende preozesse fressen keine leistung.

machst du vtl.
"bla" + "keks"
paar tausende mal? DAs zieht extrem viel elistung benutzt statdessen einen Stringbuilder
+ frisst auch keine Leistung die 100% CPU rechtfertigen würde.


@huckleberry

du fängst besser mal an dein Problem vernünftig zu beschreiben, denn das ist keine vernünftige Beschreuibung:
Mein Programm brauch nun 6 mal so lange und CPU schiesst rauf auf 100%. Es "ruckelt" dann auch. Vorher war das nicht so?
Deswegen kommen auch so Tolle Ideen wie BIOS/Viren/Messenger etc., alles Blödsinn ;)

Sieh dir doch mal deine Änderungen an bzw. poste die hier.
JD-GUI kennst du? Damit kann man .class Files dekompilieren.
 
Zuletzt bearbeitet von einem Moderator:

huckleberry

Bekanntes Mitglied
Deswegen kommen auch so Tolle Ideen wie BIOS/Viren/Messenger etc., alles Blödsinn ;)

Blödsinn würd ich das nicht nennen, es hilft mir schon weiter ;) Es fallen Sachen, woran ich nicht denke ;)

Ich kann das Projekt nicht veröffentlichen, weil es für eine Firma entwickelt wird (steht auch im Vertrag) und es mir nicht gehört (ich bin lediglich der Urheber), ich bitte um Verständnis!!!
Mir ist klar, das mir dadurch unter Umständen nicht geholfen werden kann.


Ich habe erfahren, dass Kollegen alles in separate Dateien gepackt haben, und später alles in eine geschrieben haben. Ich vermute nun sehr stark, dass es daran liegt, dass bei mir alle auf eine Datei zugreifen, auch wenn nun mittlerweile Zeitversetzt.
Da es nur eine Zeile Text (ca. 100Byte) ist, würe es mir reichen wenn Access, Write und close() alles in einer Millisekunde machbar wäre? Kann das Java?

Gibt es keine Dateihandler für den Einsatz mit Semaphoren wie weiter oben schon vorgeschlagen? Ich würde es auh irgendwohin Puffern, bis ich die Date beschreiben kann.

Weiterhin bin ich für Hilfen und hinweise dankbar. Mfg Huck
 
Zuletzt bearbeitet:

palador

Mitglied
Schonmal einen Profiler à la VisualVM ausprobiert? Da sieht man gut an welchen Stellen (Hotspots) die meiste Zeit verschwendet wird, bzw. ob Threads ewiglange oder ewig auf irgentwas warten...
 

huckleberry

Bekanntes Mitglied
Hallo Forum,

anscheinend habe ich die Ursache gefunden.

Es werden Diffie-Hellman-Schlüssel berechnet, undzwar habe ich 20-30 Schlüssel die zu einem Zeitpunnkt erzeugt werden. Mit dem ersten Kontruktor gehts es durch wie ein Bier im Sommer ;) Bei dem 2.Kontruktor werden die Schlüsselpaare live erzeugt:

Java:
package blabla.bla;

import java.io.Serializable;
import java.util.ArrayList;

final public class DHPrivateKeySet implements Serializable {
	
//	private final static int		MIN_PRIME = 17;
//	private final static int		MAX_PRIME = 32003;
	private final static int []		INT_PRIMES = 
	{
		103,	107,	109,	113,	127,	131,	137,	139,	149,	151,
		157,	163,	167,	173,	179,	181,	191,	193,	197,	199,
		211,	223,	227,	229,	233,	239,	241,	251,	257,	263,
		269,	271,	277,	281,	283,	293,	307,	311,	313,	317,
		331,	337,	347,	349,	353,	359,	367,	373,	379,	383,
		389,	397,	401,	409,	419,	421,	431,	433,	439,	443,
		449,	457,	461,	463,	467,	479,	487,	491,	499,	503,
		509,	521,	523,	541,	547,	557,	563,	569,	571,	577,
		587,	593,	599,	601,	607,	613,	617,	619,	631,	641,
		643,	647,	653,	659,	661,	673,	677,	683,	691,	701,
		709,	719,	727,	733,	739,	743,	751,	757,	761,	769,
		773,	787,	797,	809,	811,	821,	823,	827,	829,	839,
		853,	857,	859,	863,	877,	881,	883,	887,	907,	911,
		919,	929,	937,	941,	947,	953,	967,	971,	977,	983,
		991,	997,	1009,	1013,	1019,	1021,	1031,	1033,	1039,	1049,
		1051,	1061,	1063,	1069,	1087,	1091,	1093,	1097,	1103,	1109,
		1117,	1123,	1129,	1151,	1153,	1163,	1171,	1181,	1187,	1193,
		1201,	1213,	1217,	1223,	1229,	1231,	1237,	1249,	1259,	1277,
		1279,	1283,	1289,	1291,	1297,	1301,	1303,	1307,	1319,	1321,
		1327,	1361,	1367,	1373,	1381,	1399,	1409,	1423,	1427,	1429,
		1433,	1439,	1447,	1451,	1453,	1459,	1471,	1481,	1483,	1487,
		1489,	1493,	1499,	1511,	1523,	1531,	1543,	1549,	1553,	1559,
		1567,	1571,	1579,	1583,	1597,	1601,	1607,	1609,	1613,	1619,
		1621,	1627,	1637,	1657,	1663,	1667,	1669,	1693,	1697,	1699,
		1709,	1721,	1723,	1733,	1741,	1747,	1753,	1759,	1777,	1783,
		1787,	1789,	1801,	1811,	1823,	1831,	1847,	1861,	1867,	1871,
		1873,	1877,	1879,	1889,	1901,	1907,	1913,	1931,	1933,	1949,
		1951,	1973,	1979,	1987,	1993,	1997,	1999 	
	};

	
	private static final long serialVersionUID = 1234656760897983;
	private final int DH_MIN = 2;	/* minimum number, for random */
	// --> p
	private int primeModule = -1;
	// --> g
	private int primeRootOfP = -1;
	//  own public Key B
	private int ownPublicKey = -1;
	// own secret random x
	private int ownPrivateKey = -1;
	// current secretGroupKey
	private int groupPrivateKey = -1;
	// current public GroupKey
	private int groupPublicKey = -1;

// einfacher Konstruktor 1
	public DHPrivateKeySet(long id) {
		this.setPrimeRootOfP((int) (id / 10000));
		this.setPrimeModule((int) (id % 10000));
		this.setOwnPrivateKey(((int) (Math.random() * (this.getPrimeModule() - DH_MIN + 1) ) + DH_MIN));
		this.calcOwnPublicKey();
	}
	
// komplexer Kontruktor 2
	public DHPrivateKeySet(long idRegion, long utcTime) {
		int indxP = (int) idRegion % INT_PRIMES.length;
		this.setPrimeModule(INT_PRIMES[indxP]);
		ArrayList<Integer> z = calcPrimeRoots(this.getPrimeModule());
		int indxPR =(int) (utcTime % 8);
		this.setPrimeRootOfP(z.get(indxPR));
		
		this.setOwnPrivateKey(((int) (Math.random() * (this.getPrimeModule() - DH_MIN + 1) ) + DH_MIN));
		this.calcOwnPublicKey();
	}
	
	public int getPrimeModule() {
		return primeModule;
	}

	public void setPrimeModule(int primeModule) {
		this.primeModule = primeModule;
	}

	public int getPrimeRootOfP() {
		return primeRootOfP;
	}

	public void setPrimeRootOfP(int primeRootOfP) {
		this.primeRootOfP = primeRootOfP;
	}

	public int getOwnPublicKey() {
		return ownPublicKey;
	}

	public void calcOwnPublicKey() {
		this.ownPublicKey = modPow(this.getPrimeRootOfP(), this.getOwnPrivateKey(), this.getPrimeModule());
	}

	public void setOwnPublicKey(int ownPrivateKey2) {
		this.ownPublicKey = ownPrivateKey2;
	}

	public void setOwnPrivateKey(int ownPrivateKey) {
		this.ownPrivateKey = ownPrivateKey;
	}
	
	public int getOwnPrivateKey() {
		return ownPrivateKey;
	}
	
	public int getGroupPrivateKey() {
		return groupPrivateKey;
	}

	public void calcGroupPrivateKey(int receivedGrpPK) {
//		int thisPK = (myDHPrivateKeySet.getGroupPrivateKey() > 0)? this.getGroupPrivateKey():this.getOwnPublicKey();
		this.groupPrivateKey = modPow(receivedGrpPK, this.getGroupPrivateKey(), this.getPrimeModule());
	}
	
	public void setGroupPrivateKey(int groupPrivateKey) {
		this.groupPrivateKey = groupPrivateKey;
	}

	public int getGroupPublicKey() {
		return this.groupPublicKey;
	}
	
	public void setGroupPublicKey(int groupPublicKey) {
		this.groupPublicKey = groupPublicKey;
	}

	public void calcGroupPublicKey(int grpPrivKey) {
		int i = modPow(this.getPrimeRootOfP(), grpPrivKey, this.getPrimeModule());
		this.setGroupPublicKey( i );
	}	
	
    public int modPow(int param_base, int param_exp, int param_mod) {
        long result = 1;
        for(int e = 0; e < param_exp; e++) {
            result = ((result * param_base) % param_mod);
        }
        return (int) result;
    }
    
    public int modPow(int param_exp) {
        long result = 1;
        for(int e = 0; e < param_exp; e++) {
            result = ((result * this.getPrimeRootOfP()) % this.getPrimeModule());
        }
        return (int) result;
    }
    
    public static int modPower(int param_base, int param_exp, int param_mod) {
        long result = 1;
        for(int e = 0; e < param_exp; e++) {
            result = ((result * param_base) % param_mod);
        }
        return (int) result;
    }
    
    public static ArrayList<Integer> calcPrimeRoots(int p){
    	ArrayList<Integer> g = new ArrayList<Integer>();
    	for(int z = 1; z < p; z++){
    		// 1. Condition : 0 konkruent to (z^(M-1)-1)(mod M)
    		if( 0 == (modPower(z, p-1, p) - (1% p))){	
    			// 2. Condition: For all m < M-1  it holds that 0 not konkruent to (z^m-1)(mod M)
    			for(int m = 1; m< p-1; m++){
    				if( 0  == (modPower(z, m, p) - (1% p))) m = p; // quite loop						
    				if(m == p-2){		
    					g.add(z);
    				}
    			}
    		}
    	}
    	return g;
    }
} // end class

Ich weiss, diese Methode ist umständlich, aber ich dachte Java könnte das handeln? Es gibt zwar fertige DHSchlüsselErzeuger Bibliotheken, aber diese haben meist grosse Schlüssellängen, ich brauch nur integer.

Wie könnte ich das noch optimieren? Dankbar für jeden Hinweis!

Mfg HUck
 

Empire Phoenix

Top Contributor
Ich behautpe mal das die calcprime roots die ursache ist. Welches Laufzeitverhalten benutzt denn der von dir verwendete Algorithmus dort?

Weil wenn das sowas wie n^2 oder so rauskommt wundert es mich nicht. (n ist die anzahl der elemente im array)
 

Oben