Grundsätzliche Fragen zum Heap Space

Hallo liebes Forum,
ich habe ein paar grundsätzliche Fragen zum Heap Space und dem Garbage Collector.

Im Spoiler findet ihr ein Paar Gedankengänge von mir und den Hintergrund des Problems.
Wer den Text nicht lesen möchte kann das überspringen.:(
Ein kurzes Beispiel. Ich habe einen Button, der führt bei Betätigung eine SQL Abfrage durch und dann eine Zeichnung mittels JFreeChart.
Betätige ich den Button nochmals, wird eine zweite Zeichnung hinzugefügt usw.
Desweiteren gibt es einen "Alles löschen" Button.

Beobachte ich mein Programm mit VisualVM komme ich zu 1. Erkenntnis.
1. Der Used Heap steigt nicht gleichmäßig an.
Z.B. steigt er beim ersten Aufruf um 30MB, dann um 20MB und dann um 40MB etc.

Und zur 2. Erkenntnis, selbst nach dem Entfernen bleibt etwas Speicher im Heap zurück.

2. Führt also dazu, dass nach längerer Benutzung mein Speicher vollläuft.
(Ich weiß das man den Speicher vergrößern kann, das verlegt das Problem aber nur zeitlich)

Im Idealfall würde ich erreichen wollen, das wenn der "Alles löschen" Button gedrückt wird, der Heap Space wieder auf einen Anfangswert zurück springt.
Dazu habe ich versucht die ganzen Arrays und Vektoren global zu deklarieren und
Java:
Beispielarray= Null;
zu setzen und danach den GC aufzurufen.
Java:
System.gc;

Dies hat schon ein bisschen was gebracht. Allerdings bleiben nunmehr von einem "Alles löschen" zum nächsten "Alles löschen" ~20MB im Speicher. (Vorher waren es ~60MB)

Ich habe bisher verschiedene Sachen ausprobiert z.B. Klassen, Funktionen mit private, public, final zu deklarieren das hat zu Veränderungen im Speicher geführt, wobei ich nicht eindeutig sagen kann, ob grundsätzlich gut oder nicht.
Wie sieht es mit dem deklarieren von Variablen aus?
Besser alles global, oder in Subclasses aufrufen ?

So wie ich das nach einlesen in das Thema verstanden habe, bestehen bei mir noch Referenzen auf Objekte. Deswegen werden diese nicht gelöscht. Wie vermeide ich das. (meine panels werden removed, die Arrays = Null gesetzt, SeriesCollection mit remove entfernt, der GC aufgerufen, das Panel geupdatet)

Auf was sollte ich grundsätzlich beim programmieren achten um meinen Speicher nicht zuzumüllen?
Lieber Objekte in Methoden erstellen oder Global?
Private Public oder Final benutzen ?
Gibt es eine Möglichkeit zu sehen, welche Objekte sich noch in meinem Heap befinden ?
Warum kommt es manchmal dazu, das mein GC nach Aufruf z.B. 20MB frei räumt und dann ohne das sich der Speicher in der Zwischenzeit verändert hat, nach erneutem Aufruf nochmal 10 MB entfernt werden.o_O

An alle die mir Helfen ein großes THX.
 

Saheeda

Top Contributor
https://www.codecentric.de/kompetenzen/publikationen/der-garbage-collector-das-unbekannte-wesen/

Der GC arbeitet in Java komplett selbstständig.
Vorteil: Als Programmierer muss ich mich nicht mit Speicherorganisation beschäftigen.
Nachteil: Ich verliere die Kontrolle darüber, welche Referenzen wann aufgeräumt werden.

Der Algorithmus dahinter ist nicht ganz trivial. Kurz und knapp: der GC teilt den Speicher in Bereiche mit langlebigen und kurzlebigen Referenzen, die kurzlebigen Bereiche werden häufiger auf nicht genutzte Referenzen durchsuchr, die langlebigen seltener. Existiert ein Objekt lang genug, wandert es vom kurz- in den langlebigen Bereich.

Du kannst den Scope (d.h. den Gültigkeitsbereich) von Objekten so gering wie möglich halten (lokale Variablen verwenden, Variablen erst dort erzeugen/instanzieren, wo sie wirklich gebraucht werden...).

Ansonsten: Nutze den Vorteil von Java, dass du dich nicht mit dem Speicher befassen musst. Bei den heutigen Rechnern sollte es auch keinen Unterschied mehr machen, ob irgendwo 20, 60 oder 100 MB zusätzlich rumschwirren. Wenn ja, hast du ein ganz anderes Problem.
 
Der GC arbeitet in Java komplett selbstständig.
Vorteil: Als Programmierer muss ich mich nicht mit Speicherorganisation beschäftigen.
Nachteil: Ich verliere die Kontrolle darüber, welche Referenzen wann aufgeräumt werden.

Zunächst einmal, Danke für deine schnelle Antwort.
Also das eigene aufrufen des GC hat mir zumindest schon soweit weitergeholfen, das mein Programm deutlich länger laufen kann. Abgestützt ist es zwar vorher auch nicht, aber wenn der GC erst seine Arbeit beginnt, wenn der Heap Space schon fast voll ist, dann macht sich das Performancetechnisch schon sehr deutlich bemerkbar.

Du kannst den Scope (d.h. den Gültigkeitsbereich) von Objekten so gering wie möglich halten (lokale Variablen verwenden, Variablen erst dort erzeugen/instanzieren, wo sie wirklich gebraucht werden...).

Das ist ein sehr guter Tipp. Danke. Ich werde schauen was ich dahingehend verbessern kann.

Ansonsten: Nutze den Vorteil von Java, dass du dich nicht mit dem Speicher befassen musst. Bei den heutigen Rechnern sollte es auch keinen Unterschied mehr machen, ob irgendwo 20, 60 oder 100 MB zusätzlich rumschwirren. Wenn ja, hast du ein ganz anderes Problem.

Da bin ich ehrlich gesagt nicht so optimistisch. Ich habe ja auch kein Problem damit, dass allgemein 100 oder 200 MB mehr gebraucht werden. Sondern damit, dass immer wenn ich eine Grafik zeichne der Speicher ansteigt und dann sogar nach dem löschen dieser Grafik weiterhin ein Teil im Heap bleibt(~20MB).
Das ganze summiert sich sehr schnell, wenn man die gleiche Programmfunktion mehrmals hintereinander benutzt. Und da wir hier immerhin von RAM reden, halte ich im übrigen auch 100 MB schon für sehr viel.

Sprich ich habe irgendwo ein Leck und das würde ich gerne schließen.
Deswegen frage ich auch nach so allgemeinen Sachen, damit ich eben weiß worauf ich achten soll.

An meiner SQL Verbindung liegt es schon einmal nicht. Hier wird zwar der größte Menge benötigt, nach dem "alles Entfernen" Befehl s.o. kriege ich allerdings den Speicher jedesmal wieder auf den Ursprungszustand.

Lustiger weise scheint der GC manchmal etwas "Faul" zu sein.
Sprich manchmal macht er nicht die ganze Arbeit sondern nur so 2/3.
Gebe ich dann exakt den gleichen Befehl noch einmal dann cleared er auch noch den Rest. -.-'

Ich suche erstmal weiter.
Wenn jemand noch andere Hinweise hat.
Immer her damit. :)
 
Zuletzt bearbeitet:

Harry Kane

Top Contributor
Wenn du wissen willst, warum ein bestimmter Code dazu führt, dass der Speicher volläuft, ist es immer eine gute Idee, den Code auch zu posten.
So wie du dein Problem beschreibst,
meine panels werden removed, die Arrays = Null gesetzt, SeriesCollection mit remove entfernt, der GC aufgerufen, das Panel geupdatet
habe ich den Verdacht, dass du bei jeder SQL Abfrage unnötig viele Objekte wegwirfst und neu erzeugst.
Um beim Beispiel JFreeChart zu bleiben: Wenn sich die Daten ändern, muss im Allgemeinen nur ein Dataset-Objekt aktualisiert werden. Das JFreeChart-Objekt und das ChartPanel, in dem der JFreeChart liegt, können erhalten bleiben. Ich habe aber schon öfters Codes gesehen, wo bei jeder kleinen Änderung an den Daten unnötigerweise die gesamte Gui von Grund auf neu aufgebaut wird.
 
Ich bin leider die letzten Tage nicht mehr zum programmieren gekommen, aber heute Abend habe ich mir mal wieder ein bisschen Zeit freigeschaufelt.:cool:

Erstmal Danke an alle die mir helfen wollen.
Ich hoffe der lange post schreckt jetzt nicht ab. :)
Im wesentlichen konnte ich mein Leck dank eurer Hilfe finden.
Das war für mich der wesentliche Hinweis.
Du kannst den Scope (d.h. den Gültigkeitsbereich) von Objekten so gering wie möglich halten (lokale Variablen verwenden, Variablen erst dort erzeugen/instanzieren, wo sie wirklich gebraucht werden...).

Das hat zwar jetzt mein Problem gelöst führt aber dazu das ich eine Funktion verliere die ich gerne weiterhin drin habe. Aber zumindest konnte ich das Leck schon einmal lokalisieren.

Wenn du wissen willst, warum ein bestimmter Code dazu führt, dass der Speicher volläuft, ist es immer eine gute Idee, den Code auch zu posten.

Mache ich natürlich gerne. Ich wollte euch allerdings keinen ellenlangen Code vorwerfen ohne den Fehler überhaupt erstmal zu lokalisieren.
Die unwichtigen Sachen habe ich jetzt mal weggelassen, also bitte nicht wundern, wenn irgendwo Variablen auftauchen die nicht definiert sind.

Die 4 Charts und datasets bzw. TimeSeries sind global deffiniert

Java:
TimeSeriesCollection datasetS1 = new TimeSeriesCollection();   
        TimeSeriesCollection datasetS2 = new TimeSeriesCollection();
        TimeSeriesCollection datasetS3 = new TimeSeriesCollection();
        TimeSeriesCollection datasetS4 = new TimeSeriesCollection();
        //4 Chart Panels global vorbereiten um die größe Später zu verändern
        ChartPanel Chart1 = new ChartPanel(null);
        ChartPanel Chart2 = new ChartPanel(null);
        ChartPanel Chart3 = new ChartPanel(null);
        ChartPanel Chart4 = new ChartPanel(null);

Dann gibt es eine Klasse für die SQL Verbindung

Java:
public class SQL{
            public boolean connectToMysql(String host, String database, String user, String passwd){
                try{
                Class.forName("com.mysql.jdbc.Driver").newInstance();
                String connectionCommand = "jdbc:mysql://"+host+"/"+database+"?user="+user+"&password="+passwd;
                connection = DriverManager.getConnection(connectionCommand);
                return true;
                }catch (Exception ex){
                System.out.println("Verbindung aufgebaut"+false);
                JOptionPane.showMessageDialog(meinFrame, "Keine Verbindung zum SQL Server aufgebaut");
                return false;
                }
                }
        
            //Methode für einfache Datenabfrage
            public Vector getDaten(String table, String Spalte)
            { Statement stmt = null;
            ResultSet result = null;
        
            try {
            stmt = connection.createStatement();
            result = stmt.executeQuery("SELECT * FROM " + table + " where (zeit1 >= '"+ calendarStart.get(Calendar.YEAR)+ "-"+ (calendarStart.get(Calendar.MONTH)+1)+ "-"+ calendarStart.get(Calendar.DAY_OF_MONTH)+ " 00:00:00' and zeit1 <= '"+ calendarEnde.get(Calendar.YEAR)+ "-"+ (calendarEnde.get(Calendar.MONTH)+1)+ "-"+ calendarEnde.get(Calendar.DAY_OF_MONTH)+ " 00:00:00');");
            result.first();
            Vector SQLDaten = new Vector();
        
            while(! result.isAfterLast())
            {
            String werte = result.getString(Spalte);
            SQLDaten.add(werte);
            result.next();
            }
            return SQLDaten;
            }
            catch (Exception ex) {
            System.out.println("Error during access + " + table + "\n" + ex.getMessage());
            JOptionPane.showMessageDialog(meinFrame, "Ein Fehler ist beim laden der Daten aufgetreten. Möglicherweise ist die Anzahl der Daten zu groß.");
            return null;
            }
            }
        }

Eine Klasse um das ganze zu zeichnen.

Java:
public class Grafik{
            public TimeSeries getNewSeries (String RaumNummer, String GrafikNummer){       
                SQLhost = "geheim";
                SQLdatabas = "geheim";
                SQLuser = "geheim";
                SQLpasswd = "geheim";
                SQL  Verbindung = new SQL();
            
                Verbindung.connectToMysql(SQLhost, SQLdatabas, SQLuser, SQLpasswd);
                 SQLtable = "raum"+RaumNummer;//Tabelle zum zugehöhrigen Raum
                 SQLGrafikwerte = "werte"+GrafikNummer;//wert zur zugehörigen Grafik
                 SQLGrafikzeit = "zeit"+GrafikNummer;//zeit zur zugehörigen grafik
            
                dummyX = (String[])Verbindung.getDaten(SQLtable, SQLGrafikzeit).toArray(new String[Verbindung.getDaten(SQLtable, SQLGrafikwerte).size()]);
                dummyY = (String[])Verbindung.getDaten(SQLtable, SQLGrafikwerte).toArray(new String[Verbindung.getDaten(SQLtable, SQLGrafikzeit).size()]);
            
                TimeSeries Series = new TimeSeries("Raum "+ AuswahlRaum +" Grafik "+ AuswahlGrafik);
            
                for (int i = 0; i<dummyX.length; i++){
                    //Umwandeln von String Timestamp SQL in java Date
                    Series.add(Second.parseSecond(dummyX[i]), Double.parseDouble(dummyY[i]));
                }
                return Series;
            }
    
        
            // Methode um dataset zusammenzubauen
            public TimeSeriesCollection buildtDataset(TimeSeries series){ 
                    if (datasetCoCounter == 1){
                        datasetS1.addSeries(series);
                        return datasetS1;
                        }
                    else if (datasetCoCounter == 2){
                        datasetS1.addSeries(series);
                        return datasetS1;
                        }
                    else if (datasetCoCounter == 3){
                        datasetS1.addSeries(series);
                        return datasetS1;
                        }
                    else if (datasetCoCounter == 4){
                        datasetS1.addSeries(series);
                        return datasetS1;
                        }
                    else{
                        System.out.println("Error - Zu viele Datasets erstellt");//nur zumm testen
                        return null;
                    }
            }
        
            //Neue Methode um Dataset zu plotten
            public ChartPanel plot(TimeSeriesCollection timeSeriesCollection, String nameX, String nameY){
                XYLineAndShapeRenderer line = new XYLineAndShapeRenderer();
                XYPlot plot = new XYPlot(timeSeriesCollection,xax,yax, line);
            
                JFreeChart chart = new JFreeChart(plot);
                ChartPanel chartPanel = new ChartPanel(chart);
                return chartPanel;
            }
        }

Und schließlich die drei ActionListener die die notwendigen Sachen ausführen

Java:
//Neuer Single Plot Listener um eine neue Grafik zu erstellen
        public class SinglePlotButtonListener implements ActionListener {
            public void actionPerformed(ActionEvent a) {
                if (datasetCoCounter <= 3){
                    Grafik  SinglePlot = new Grafik();
                    datasetCoCounter = datasetCoCounter +1;
                        if (datasetCoCounter == 1){
                            Chart1 = SinglePlot.plot(SinglePlot.buildtDataset(SinglePlot.getNewSeries(AuswahlRaum, AuswahlGrafik)), "Zeitachse", "Ordinate");
                            panelMitte.add(Chart1);
                            }
                        else if (datasetCoCounter == 2){
                            Chart2 =
SinglePlot.plot(SinglePlot.buildtDataset(SinglePlot.getNewSeries(AuswahlRaum, AuswahlGrafik)), "Zeitachse", "Ordinate");
                            panelMitte.add(Chart2);
                            }
                        else if (datasetCoCounter == 3){
                            Chart3 = SinglePlot.plot(SinglePlot.buildtDataset(SinglePlot.getNewSeries(AuswahlRaum, AuswahlGrafik)), "Zeitachse", "Ordinate");
                            panelMitte.add(Chart3);
                            }
                        else if (datasetCoCounter == 4){
                            Chart4 = SinglePlot.plot(SinglePlot.buildtDataset(SinglePlot.getNewSeries(AuswahlRaum, AuswahlGrafik)), "Zeitachse", "Ordinate");
                            panelMitte.add(Chart4);
                            }
                        else{
                            System.out.println("Error - Zu viele Chart Panels erzeugt erstellt");//nur zumm testen
                        }
                    //Multi Plot Button anwählbar machen
                    MultiPlotButton.setEnabled(true);
                    panelMitte.updateUI();
                    }
                else{
                    JOptionPane.showMessageDialog(meinFrame, "Bitte nur 4 Plot Fenster erstellen");
                }
            }
        }
    
    
        //Remove All Charts Listener
        public class RemovePlotListener implements ActionListener {
            public void actionPerformed(ActionEvent a) {
                datasetCoCounter = 0;
                datasetS1.removeAllSeries();
                datasetS2.removeAllSeries();
                datasetS3.removeAllSeries();
                datasetS4.removeAllSeries();
                panelMitte.removeAll();
                MultiPlotButton.setEnabled(false);
                panelMitte.updateUI();
                Chart1.removeAll();
                Chart2.removeAll();
                Chart3.removeAll();
                Chart4.removeAll();
            
                dummyX = null;//String Arrays referenz entfernen damit Garbage Collector entfernen kann
                dummyY = null;//String Arrays referenz entfernen damit Garbage Collector entfernen kann
            
                System.gc();//Aktiviert den Garbage Collector
            }
        }
    
        //Multi Plot Listener
        public class MultiPlotListener implements ActionListener {
            public void actionPerformed(ActionEvent a) {
                Grafik  plotTest = new Grafik();
                //Das bereits ausgewählte Dataset nur ergänzen und zeichnung updaten
                plotTest.buildtDataset(plotTest.getNewSeries(AuswahlRaum, AuswahlGrafik));
                panelMitte.updateUI();
            }
        }

Bitte nicht über if else Bedingungen wundern, die keinen Sinn machen. Ich habe dort jetzt der Übersicht halber ein bisschen Code weggelassen.
Im wesentlichen passiert folgendes. Ich habe mit dem SinglePlotButtonListener die Möglichkeit bis zu 4 Grafiken anzuzeigen.
Mit dem MultiPlotListener kann ich in der zuletzt aktivierten Grafik weitere Graphen hinzufügen.
Mit dem RemovePlotListener entferne ich alle aufgerufenen Grafiken.

Mein Problem mit dem Heap konnte ich beheben, indem ich die global deffinierten datasets1 -4
entfernt habe.
Java:
//TimeSeriesCollection datasetS1 = new TimeSeriesCollection();
und dafür lokal nur einen datasetS1 in der buildtDataset Funktion in der Grafik Klasse definiert habe.
Die
Java:
datasetS1.removeAllSeries();
Befehle im RemovePlotListener wurden dementsprechend auch hinfällig.

Das Ergebnis ist besser als ich erhofft habe. Ich verliere jetzt gar keinen Speicher mehr.
Nach Betätigung des Remove Buttons geht der Heap immer zurück auf seinen Startwert.
Toll. Genau das was ich wollte. Allerdings verliere ich dadurch die Möglichkeit meinen MultiPlotListener zu benutzen. Da die Daten nicht mehr im Speicher sind und datasetS1 bis 4 nicht global definiert sind.

Grade bin ich ratlos wie ich das Problem beheben kann, ohne eine wesentliche Funktion meines Programmes aufzugeben. datasetS1.removeAllSeries(); scheint jedenfalls nicht richtig zu funktionieren. :(

Wenn jemand eine Idee hat. Immer her damit.
Wenn jemand eine Idee hat, wie ich meine SQL Verbindung beschleunigen kann. Auch das würde mich interessieren.
Grundsätzlich gilt aber, wer den post bis hier gelesen hat, verdient schon einmal ein Thx.^^
 

Saheeda

Top Contributor
Ich meinte nicht, dass du gar keine globalen Variablen benutzen sollst. Die können durchaus sinnvoll sein. Wenn der benötigte Scope global ist, dann ist das halt so. Du solltest halt nur vermeiden, sämtliche Variablen, die irgendwo mal auftauchen, global zu definieren, selbst wenn du sie nur ein einziges Mal benötigst.
 
Ich meinte nicht, dass du gar keine globalen Variablen benutzen sollst. Die können durchaus sinnvoll sein. Wenn der benötigte Scope global ist, dann ist das halt so.

So habe ich das auch nicht verstanden. Ich benutze auch jetzt noch globale Variablen. Die Änderung oben soll nur klar machen, wo das Speicherleck liegt.
Eine Lösung ohne meine MultiPlot Funktion zu verlieren habe ich leider noch nicht.
 

Thallius

Top Contributor
Ohne das Ganze jetzt komplett durchgelesen zu haben. Warum brauchst du globale Variablen um auf die Datasets zuzugreifen? Dafür kannst du doch genausogut eine Mthode in den Dataset erzeuger implementieren, der dir das dataset zurück gibt. Hat auch den Vorteil, das der MultiPlot immer die aktuell vorhandenen SinglePlots bekommt und Du dich nicht noch darum kümmern must irgendwelche globalen VAriablen aktuell zu halten.

Gruß

Claus
 
Nur eine kurze Rückmeldung von mir.
Ich hatte leider die letzten Tage wenig Zeit an meinem kleinen Programm zu arbeiten, aber heute habe ich mich nochmal dran gesetzt. :)
Ich konnte alles meine Probleme beheben. :cool:Danke an alle die mir geholfen haben.
(Um das ganze vielleicht noch ein bisschen schneller zu bekommen mache ich vielleicht nochmal einen neuen Thread auf, da der Code nicht mehr viel mit dem hier oben zu tun hat.)

Aber eine Frage passt hier noch ganz gut rein.
Kann man den HeapSpace auch dauerhaft erhöhen? Also nicht nur in eclipse sondern so, das die entsprechenden Einstellungen in das jar file übernommen werden?
 
Im JAR-File geht das nicht. Du kannst aber beim start der JVM mit den Schaltern -Xms und -Xmx Minimal- und Maximalgröße angeben.

Also bisher bin ich hingegangen und habe in eclipse unter run -> run configurations -> VM Arguments mit
-Xms64m
-Xms512m
die Einstellungen angepasst. Diese Einstellung wird ja allerdings nicht übernommen, wenn ich aus meinem Projekt mit export ein jar file erstelle. Diese Einstellung gilt scheinbar nur für das starten in eclipse.
Je nachdem auf welchem System ich dann die Datei starte wird der HeapSpace unterschiedlich festgelegt.
Meine Frage war jetzt, ob ich irgendwo eine dauerhafte Einstellung machen kann ?
Wenn das geht, kannst du mir genau sagen wo ich was machen/ einstellen muss.
Habe nach Suche nichts gefunden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
nonickatall Klassen Grundsätzliche Fragen zu geplanter Programmstruktur Allgemeine Java-Themen 5
DStrohma Grundsätzliche Fragen zum Aufbau eines komplexeren Programmes Allgemeine Java-Themen 8
D Grundsätzliche Fragen zur Grafikdarstellung in Spielen Allgemeine Java-Themen 2
Zrebna Fragen zu Testabdeckungs-Metriken Allgemeine Java-Themen 4
MarvinsDepression Unbekanntes Zeichen in fremden Code wirft Fragen auf Allgemeine Java-Themen 4
B HTTP Allgemeine Fragen über Suchmaschine nutzen mit Java Allgemeine Java-Themen 20
K BlueJ - Fragen zu dem Spiel Pacman (Nachprogrammieren) Allgemeine Java-Themen 141
V Ich hätte 2 Fragen Allgemeine Java-Themen 5
ME2002 Fragen aus einer Java Klausur Allgemeine Java-Themen 67
H Fragen zur Kraken Api Allgemeine Java-Themen 1
W Ein paar Fragen zu .properties und .css Allgemeine Java-Themen 6
W Mal ein paar generelle Fragen zu InputStream und OutputStream Allgemeine Java-Themen 4
X Fragen zur Javamail API und Gmail Allgemeine Java-Themen 4
T Fragen bezgl. Lambdas Allgemeine Java-Themen 20
X Collections Fragen zu gleichen Elementen in TreeSet Allgemeine Java-Themen 35
A Neuerungen in Java 8 StreamAPI- Paar fragen Allgemeine Java-Themen 4
temi Fragen zur Software-Architektur Allgemeine Java-Themen 123
M Diverse Design-Fragen Allgemeine Java-Themen 6
J 2 Fragen zur Vererbung Allgemeine Java-Themen 5
H Java FX 2 Fragen um Programm in mehrere sprachen zu übersetzen in Gluon Framwork Allgemeine Java-Themen 3
M Fragen beantworten über Textfeldeingabe Allgemeine Java-Themen 5
J Allgemeine Fragen zu Vererbung Allgemeine Java-Themen 1
M Allgemeine Fragen meinerseits Allgemeine Java-Themen 4
V Wie kann ich die Fragen mit den anderen Klassen verbinden? Allgemeine Java-Themen 1
J Fragen zu generischer doppelt verketteter Liste (bei fehlendem Grundverständnis) Allgemeine Java-Themen 1
R Es gibt keine dummen Fragen (hab ich mal gehört) Allgemeine Java-Themen 11
T Fragen zum Thread-Thema Allgemeine Java-Themen 4
2 2 Klein Fragen Allgemeine Java-Themen 7
alderwaran .jar Code Signing, User-Keystore und Fragen dazu Allgemeine Java-Themen 0
T Fragen zum Thread-Thema Allgemeine Java-Themen 9
A Java Theorie-Fragen Allgemeine Java-Themen 7
K Java QUIZ-Spiel Fragen und Antworten generieren?! Allgemeine Java-Themen 5
R Socket Fragen zu UDP Allgemeine Java-Themen 1
B Noob-Fragen zu Tablets und PC kompatiblität... Allgemeine Java-Themen 6
D Ein paar allgemeine Fragen zu Java Allgemeine Java-Themen 19
L Fragen für Facharbeit: Analyse von Strings in Java Allgemeine Java-Themen 4
R Fragen zu Server + UI Allgemeine Java-Themen 2
U Vier Fragen zu Java Allgemeine Java-Themen 2
H MediaManager Fragen/Probleme Allgemeine Java-Themen 6
D Fragen zum erstellen einer ausführbaren Jar Datei Allgemeine Java-Themen 3
C Polymorphie Fragen zur Annotations von Persistenz Allgemeine Java-Themen 2
O Fragen über Fragen - Bei Änderung XML-Datei -> Anpassung GUI Allgemeine Java-Themen 7
StrikeTom Java Performance Fragen Allgemeine Java-Themen 5
Luk10 Fragen zum ByteBuffer (lwjgl - icons) Allgemeine Java-Themen 2
F Akkumulator Hough-Transformation offene Fragen Allgemeine Java-Themen 4
Luk10 Fragen zu Naming-Conventions Allgemeine Java-Themen 5
Z Einige Fragen Allgemeine Java-Themen 10
T OOP Einige Fragen zu UML-Klassendiagrammen Allgemeine Java-Themen 6
G Einige Fragen zu ResourceBundles Allgemeine Java-Themen 2
S Fragen zu verschiedenen Themen vom JCreator Allgemeine Java-Themen 2
Semox Grapheneditor - Allgemeine Fragen zum Logikdesign Allgemeine Java-Themen 3
O kleine Fragen eines Anfängers Allgemeine Java-Themen 2
X Executor fragen ob fertig Allgemeine Java-Themen 13
nrg Swing 2 Fragen zu Swing/AWT Allgemeine Java-Themen 7
K Reflections Fragen Allgemeine Java-Themen 7
S Fragen zum SCJD-Zertifikat Allgemeine Java-Themen 2
M Backend Entwicklung - Konzept fragen Allgemeine Java-Themen 3
E Fragen zu Scala Allgemeine Java-Themen 11
Daniel_L Fragen zu RegEx und URL umwandeln Allgemeine Java-Themen 4
J Diverse Fragen bezüglich Jasper Allgemeine Java-Themen 3
S Fragen zum ShutdownHook Allgemeine Java-Themen 7
V Fragen zu einem Java Browser Allgemeine Java-Themen 7
G Fragen zum eigenen Scheduler Allgemeine Java-Themen 4
M Drag and Drop: 3 Fragen Allgemeine Java-Themen 3
L Einige Fragen zu Java Allgemeine Java-Themen 9
F Linguistische Fragen zu Javadoc bzw. Englisch Allgemeine Java-Themen 4
E Einfache Fragen zu Dateien Allgemeine Java-Themen 7
E Thread Fragen in Verbindung mit Swing Allgemeine Java-Themen 4
M MVC Design Pattern - Verständniss Fragen Allgemeine Java-Themen 3
X Einige Fragen zu Serialisierung Allgemeine Java-Themen 2
H Java Multiplicoice Test (10 Fragen) Allgemeine Java-Themen 11
J Viele Fragen. =) Hoffentlich könnt ihr helfen Allgemeine Java-Themen 9
J 2 Fragen zu JMF und eine Rechtsfrage Allgemeine Java-Themen 3
S Viele Fragen eines Umsteigers (von .NET) Allgemeine Java-Themen 6
C LinkedList Fragen Allgemeine Java-Themen 7
P Fragen zur JBuilder und den kosten. Allgemeine Java-Themen 7
reibi JVM fragen welche Apps geladen sind Allgemeine Java-Themen 7
I Fragen zum Internetseiten Einlesen/Auswerten Allgemeine Java-Themen 5
F Paket und Software Design Fragen. Allgemeine Java-Themen 5
S 2 Fragen allgemeine fragen zu final und interface Allgemeine Java-Themen 13
M ein paar fragen über JBoss und Catalina Allgemeine Java-Themen 7
D Allgemeine Fragen zum Speichern Allgemeine Java-Themen 3
F allgemeine Fragen zu Java Allgemeine Java-Themen 9
S Fragen zu 4 speziellen Listen Allgemeine Java-Themen 4
U JFrame, JOptionPane - vor dem Schließen Benutzer fragen Allgemeine Java-Themen 10
I zwei simple fragen Allgemeine Java-Themen 22
G 2 Fragen Allgemeine Java-Themen 7
G Fragen zu ausführbaren JAR Files Allgemeine Java-Themen 23
G Fragen zu JTextField bzw. JTextArea Allgemeine Java-Themen 2
J 5 Fragen. Allgemeine Java-Themen 2
P Tausend Fragen... Allgemeine Java-Themen 3
E Wie Java Heap Space vergrößern? Allgemeine Java-Themen 3
A Heap-Sort Allgemeine Java-Themen 2
L Java OutOfMemoryError Java heap space Allgemeine Java-Themen 3
H Änderung im maximalen heap space unter Windows 7 ?! Allgemeine Java-Themen 5
N Mögliches heap space lokalisieren Allgemeine Java-Themen 11
D Datentypen Cache Images Heap Space Error Allgemeine Java-Themen 7
Thallius Wie mache ich eine Java App mit Icon startbar die mehr Heap Speicher braucht? Allgemeine Java-Themen 3
T jstat Heap(Size/Usage) PermGen(Size/Used) vs JVisual VM Allgemeine Java-Themen 2
H Frage wegen Heap-Speicher Allgemeine Java-Themen 2

Ähnliche Java Themen

Neue Themen


Oben