Habe ein Programm geschrieben, daß in 2 Teile gegliedert werden kann.
Der erste Teil ist eine GUI. Von der GUI wird der 2. Teil (Rechenteil) aufgerufen.
Rufe ich das Rechenprogramm über GUI auf, hängt mein Rechner sich auf.
Wenn ich aber das Rechenprogramm über eine eigene Main-Methode starte,
gibt es keine Probleme.
Zusatzinfo: Alle Klassen sind erfolgreich kompiliert. Im Berechnungsprogramm wird eine große Menge von Arrays verwendet.
Kann es sein, daß die Java-Virtuelle-Maschine nicht über genügend Speicherplatz für meine Vielzahl von Arrays verfügt? Wie kann ich diesen maximieren? Oder gibt es bessere Lösungen?
Programmieren - alles kontrollieren 4.941 Themen, 20.708 Beiträge
Deine Problembeschreibung reicht für eine Analyse
der Ursache nicht aus.
Hängt sich wirklich der ganze Rechner auf oder ist
er nur sehr beschäftigt (hohe Prozessorauslastung) ?
Wie Du schon erwähntest, laufen Java Programme in
einer virtuellen Java Maschine (JVM) ab und
sollten deshalb eigentlich nicht in der Lage sein,
das Gast Betriebsystem zum Absturz zu bringen.
(Es sei denn, Du hast mit JNI programmiert.)
Speicherplatz kannst Du der JVM über Kommandozeilenparameter
mitgeben.
Gib einfach mal "java -X" ein, dann siehst Du die Parameter.
Für Dich kämen die Optionen -Xms
Also erstmal danke für die schnelle Antwort.
Also ich weiß nicht genau wie sich das Aufhängen des Rechers genau definiert. Jedenfalls muß ich mein Programm über den Taskmanager beenden. Und das funktioniert auch nicht gleich beim ersten Mal. Irgendwann kommt dann die Meldung, daß das Programm nicht mehr reagiert. Wenn ich dann "sofort schließen" klicke, dauert das auch noch immer ein wenig bis sich das Programm auch wirklich schließt.
Hab das Programm mal laufen lassen, und hab nebenbei den Taskmanager geöffnet gehabt. Also die CPU-Leistung stieg mit Aufrufen des Programms auf 100% an. Wenn ich dann den Button drücke, womit ich das Rechenprogramm aufrufe, "hing" der Rechner wieder. Die CPU-Kurve war weiterhin bei 100% und fiel ab und zu mal kurz auf 0% und war aber sofort wieder bei 100%.
Für die Parameter -Xms, - Xmx und - Xss muß man noch ne Größe mitgeben. Welche Werte schreibt man da denn rein?
Die Grösse kann man z. B. in MB angebeben:
java -Xms64M .....
Deine Angaben lassen darauf schließen, daß Dein Programm
nicht abstürzt, sondern sehr viel CPU Last erzeugt.
Anscheinend ist das Prg. dann in den Rechenroutinen
und kann keine Mausereignisse mehr verarbeiten.
Zu wenig Arbeitsspeicher kann zwar eine Ursache sein,
ist aber eher unwahrscheinlich.
Poste doch mal ein paar Quelltext Ausschnitte, aus denen man
erkennen kann, wie Du die Rechenroutine aus der GUI heraus
aufrufst.
// Das ist die GUI-Klasse
// Über einen JFileChooser kann man eine Datei auswählen.
public class Netz3D extends JFrame
{
public Netz3D (String title)
{
setTitle(title);
init();
}
...
public void init()
{
...
}
// Wenn ich den Button klicke, wird FillArrays aufgerufen,
// wobei der Dateiname (infile) weitergegeben wird
public void AusgleichenActionPerformed (ActionEvent evt)
{
FillArrays fa = new FillArrays(anzKoord, anzBeob, anzGruppen,
Pfad, infile, outfile);
}
...
public static void main (String[] args)
{
try
{
UIManager.setLookAndFeel
(UIManager.getSystemLookAndFeelClassName());
}
catch(Exception e)
{
e.printStackTrace();
}
new Netz3D("Netz3D-Programm");
}
}
// Diese Klasse liest mit BufferedReader Daten aus dem infile und
// schreibt sie in die Arrays
public class FillArrays
{
public FillArrays(int anzKoord,
int anzBeob,
int anzGruppen,
String Pfad,
String infile,
String outfile)
{
// Hier werden die Arrays mit Hilfe bestimmter Methoden gefüllt.
...
// Wenn die Arrays gefüllt sind, wird von hier die Rechen-
// Klasse aufgerufen
Ausgleich agl = new Ausgleich(nahkoor, beob, GruppeWerte,
beobinfo, Unbekannte, GruppeInfo,
PktInfo, alpha, sapri, u,
Ellipsoid, Koordsys, outfile);
}
// Ausgleich.java ist die Berechnungsklasse. Hier wird wie schon
// erwähnt mit vielen und
// vor allem großen Arrays gerechnet.
public class Ausgleich
{
public Ausgleich(double[][] nahkoor,
double[][] beob,
double[][] GruppeWerte,
int[][] beobinfo,
int[][] Unbekannte,
String[][] GruppeInfo,
int[] PktInfo,
double alpha,
double sapri,
int u,
String Ellipsoid,
String Koordsys,
String dateiname)
{
...
}
// Vielleicht hilft es dir (bzw. mir). Oder verwirrt dich das?
// nochmal zur Info: Die Arrays in der Berechnungsklasse haben
// insgesamt 175431 Felder
Ich bin es nochmal,
es ist für mich sehr wichtig, daß ich dieses Problem gelöst bekomme. Bei diesem Programm handelt es sich um meine Diplomarbeit.
Wenn es dir nichts ausmacht, kannst du mir auch direkt an meine E-Mail-Adresse schreiben.
Dann kann ich dir das Programm auch mal schicken. D.h. wenn du dafür Zeit hast.
E-Mail-Adresse: Mr.Propp@gmx.de
Übrigens noch als Info: Ich kann genau sagen bis wo das Programm läuft, wenn ich einen bestimmten Teil auskommentiere. Es stockt immer genau dann , wenn ich eine Instanz einer anderen Klasse bilde z.B.:
SVD svd = new SVD();
Dabei kann ich vor dieser Zeile aber noch beliebig viele andere Variablen deklarieren und berechnen, ohne daß das Programm abstürzt.
Danke nochmal für die Mühe, die du dir machst.