tutorials.de Buch-Aktion 05/2012
Seite 2 von 2 ErsteErste 12
ERLEDIGT
NEIN
ANTWORTEN
21
ZUGRIFFE
1302
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #16
    ElJarno ElJarno ist offline Mitglied Silber
    Registriert seit
    May 2010
    Beiträge
    88
    Ja, das mit den String weiß ich ja, nur ich red davon allgmeine Objekte jeglicher Art anstatt neu zu erstellen, wiederzuverwenden
     

  2. #17
    Tikonteroga Tikonteroga ist offline Mitglied Gold
    Registriert seit
    Apr 2007
    Beiträge
    153
    Hallo,

    beim Wiederverwenden von den Objekten, kannst ja auch erstmal immer Abwägen, ob sich der Aufwand lohnt.

    Es macht natürlich nicht immer Sinn bzw. ist auch nicht immer möglich.

    Du könntest auch mal schauen, ob du in einer deiner Klasse unnötigerweise irgendwelche Werte oder Referenzen in den Properties als Globale Variable innerhalb einer Klasse speicherst. Das sollte man nicht nur der Einfachheit halber machen, sondern nur wenn es sein muss. Möglichst die Variablen immer lokal in den Methoden deklarieren. Der Stack einer Methode räumt sich nach deren Beendigung von ganz alleine auf.

    Es ist auch gut zu wissen, was auf dem Stack gespeichert wird und was auf dem Heap. Alles mit 'new' ist auf dem Heap. Das gilt auch für diese imutable Klassen wie String und BigDecimal, ...
     

  3. #18
    Tikonteroga Tikonteroga ist offline Mitglied Gold
    Registriert seit
    Apr 2007
    Beiträge
    153
    Hallo,

    also Klassen wie Collections, StringBuilder und auch JPanel kannst du wiederverwenden.

    Das JPanel hat dafür die removeAll() Methode. Der StringBuilder hat die setLength() und eine Collection hat die clear() Methode.
    ElJarno bedankt sich. 

  4. #19
    Anime-Otaku Anime-Otaku ist offline Mitglied Brillant
    Registriert seit
    Aug 2005
    Ort
    Karlsruhe (Baden-Württemberg)
    Beiträge
    905
    Ich glaube aber, dass wir so nicht weiterkommen. Entweder brauchen wir mehr Informationen/Source zu deinem Programm oder du musst mehr profilen.

    Hier ein paar Tipps noch:
    a)
    Ich würde dir auf jeden Fall empfehlen den Heap-Speicher mit der JConsole zu überwachen und öfters manuell den GC anzuwerfen, um zu sehen, ob wirklich soviel Speicher verwendet wird. Und dann den Heap-Speicher mit etwas Puffer maximal so einstellen.

    b)
    Überlege dir, ob du irgendwo, wo es langsam wird im AWT-Thread etwas gemacht wird, welches man als eigenen Thread hätte auslagern sollen, damit die Graphik nicht blockiert wird?

    c)
    Vielleicht bringt ein detailiertes profiling in deiner IDE auch viel. Z.b. TPTP in eclipse.

    Vielmehr kann ich dir leider auch nicht helfen.
    ElJarno bedankt sich. 
    Wäre super wenn ihr euren Code in dieser Form einfügt:
    Code java:
    1
    
    System.out.println("Hello World");
    [java]System.out.println("Hello World");[/java]
    Für erledigte Threads dürft ihr den "erledigt"-Button anklicken!
    Über Dank freut sich jeder, der euch geholfen hat - ein Klick auf "Danke" kostet ja nicht mal was
    Blog: http://javaeffective.wordpress.com/

  5. #20
    ElJarno ElJarno ist offline Mitglied Silber
    Registriert seit
    May 2010
    Beiträge
    88
    Also erst einmal eines vorweg, ihr sei echt die ersten die so hilfreich bei der Sache bleiben und das auch noch in diesem Forum, wo ich sonst eigentlich immer recht lange auf Antworten warten muss. Dafür schon mal en fettes Lob.

    Jetzt zu dem Profiling
    Zitat Zitat von Anime-Otaku Beitrag anzeigen
    Vielleicht bringt ein detailiertes profiling in deiner IDE auch viel. Z.b. TPTP in eclipse.
    Was genau ist das, ich hab da nämlich keine Ahnung von also was genau ist Profiling, analyse des Ressourcenverbrauchs?

    Zu den Tipps mit Collections, Panel und Stringbuilder werd ich auf jeden fall mal ausprobieren. Ich hab das ganze mal mit VisualVM gestartet und da ist auf jeden Fall zu sehehn das Arrays vom Typ String, int und byte den meisten Speicher besetzen.

    Hier mal ein paar kleine Ausschnitte aus dem Code hier wie ich meine Programme initialisiere:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    
    private void programmStarten(Programm programmObjekt) {
            if (!(programmObjekt == null || programmObjekt.equals(""))) {
                try {
                    if (programmObjekt.getProgrammTyp() != 0
                            && programmObjekt.getProgrammKlasse() != null) {
                        PersonalBerechtigung berechtigung = this
                                .getBerechtigung(programmObjekt);
                        if (berechtigung != null) {
                            Class<?> klasse = Class.forName(programmObjekt
                                    .getProgrammKlasse());
     
                            edStatusBar.getProgressBars().get(1).setVisible(true);
                            edStatusBar.getProgressBars().get(1).setMinimum(0);
                            edStatusBar.getProgressBars().get(1).setMaximum(100);
     
                            this.addStatusMeldung(MeldungsTyp.NORMAL, "Starte: "
                                    + programmObjekt.getProgrammInfoText());
                            edStatusBar.getProgressBars().get(1).setValue(10);
                            this.addStatusMeldung(
                                    MeldungsTyp.NORMAL,
                                    "Erstelle Instanz von: "
                                            + programmObjekt.getProgrammInfoText());
                            edStatusBar.getProgressBars().get(1).setValue(20);
                            Object obj = klasse.newInstance();
                            this.addStatusMeldung(MeldungsTyp.NORMAL,
                                    "Übergabe der Statusbarreferenz an das Programm");
                            edStatusBar.getProgressBars().get(1).setValue(70);
                            if (obj instanceof ProgrammInterface) {
                                ProgrammInterface programmInterface = (ProgrammInterface) obj;
                                if (berechtigung.getBerechtigung() == 1) {
                                    programmInterface.setEditierbar(true);
                                } else {
                                    programmInterface.setEditierbar(false);
                                }
                                programmInterface
                                        .setBerechtigung(berechtigungsListe);
                                programmInterface
                                        .setProgrammListe(this.programmListe);
                                programmInterface
                                        .setMitarbeiterID(this.mitarbeiterID);
                                programmInterface.setProgramm(programmObjekt);
                            }
                            if (obj instanceof EDStatusBarInterface) {
                                EDStatusBarInterface statusBar = (EDStatusBarInterface) obj;
                                statusBar.setEDStatusBar(edStatusBar);
                            }
                            if (obj instanceof MeldungenInterface) {
                                MeldungenInterface meldungInterface = (MeldungenInterface) obj;
                                meldungInterface.setTableMeldungen(panelExplorer
                                        .getPanelMeldungen().getTableMeldungen());
                            }
                            if (obj instanceof FavoritenChangeListenerAddRemove) {
                                FavoritenChangeListenerAddRemove listenerAdd = (FavoritenChangeListenerAddRemove) obj;
                                listenerAdd
                                        .addFavoritenChangeListener(new FavoritenChangeListener() {
                                            public void stateChanged(
                                                    FavoritenChangeEvent e) {
                                                setFavoritButtonEnabled(e
                                                        .getProgrammFavorit());
                                            }
                                        });
                            }
                            if (obj instanceof DBChangeListener) {
                                DBChangeListener changeListener = (DBChangeListener) obj;
                                for (Object programm : programme) {
                                    if (programm instanceof DBChangeListenerAddRemove) {
                                        DBChangeListenerAddRemove listenerAdd = (DBChangeListenerAddRemove) programm;
                                        listenerAdd
                                                .addDBChangeListener(changeListener);
                                    }
                                }
                                // Falls Panel sowohl DBChangeListener als auch
                                // DBChangeListenerAddRemove implementiert
                                if (changeListener instanceof DBChangeListenerAddRemove) {
                                    DBChangeListenerAddRemove listenerAdd = (DBChangeListenerAddRemove) changeListener;
                                    listenerAdd.addDBChangeListener(changeListener);
                                }
                            }
                            if (obj instanceof DBChangeListenerAddRemove) {
                                DBChangeListenerAddRemove listenerAdd = (DBChangeListenerAddRemove) obj;
                                for (Object programm : programme) {
                                    if (programm instanceof DBChangeListener) {
                                        DBChangeListener changeListener = (DBChangeListener) programm;
                                        listenerAdd
                                                .addDBChangeListener(changeListener);
                                    }
                                }
                                listenerAdd
                                        .addDBChangeListener(new DBChangeListener() {
                                            @Override
                                            public void stateChanged(DBChangeEvent e) {
                                                if (e.getTabellenName().equals(
                                                        "programm_log")) {
                                                    try {
                                                        panelExplorer
                                                                .getPanelVerlauf()
                                                                .refreshTable();
                                                    } catch (Exception e1) {
                                                        e1.printStackTrace();
                                                    }
                                                }
                                            }
                                        });
                            }
                            if (obj instanceof ProgrammStartListenerAddRemove) {
                                ProgrammStartListenerAddRemove progrStartInterface = (ProgrammStartListenerAddRemove) obj;
                                progrStartInterface
                                        .addProgrammStartListener(new ProgrammStartListener() {
                                            @Override
                                            public void startProgramm(
                                                    ProgrammStartEvent e) {
                                                programmStarten(e.getProgramm());
                                                if (tabbedPaneProgrammme
                                                        .getSelectedComponent() instanceof EDToolBarMethoden) {
                                                    EDToolBarMethoden toolBarMethoden = (EDToolBarMethoden) tabbedPaneProgrammme
                                                            .getSelectedComponent();
                                                    if (e.getObjektID() != null
                                                            && !e.getObjektID()
                                                                    .equals("")) {
                                                        toolBarMethoden
                                                                .auffrischen(new String[] { e
                                                                        .getObjektID() });
                                                    }
                                                }
                                            }
                                        });
                            }
                            if (obj instanceof EDToolBarMethoden) {
                                EDToolBarMethoden toolBarMethoden = (EDToolBarMethoden) obj;
                                if (programmObjekt instanceof ProgrammFavorit) {
                                    ProgrammFavorit programmFavorit = (ProgrammFavorit) programmObjekt;
                                    if (!(programmFavorit.getProgrammSchluesselID() == null || programmFavorit
                                            .getProgrammSchluesselID().equals(""))) {
                                        toolBarMethoden
                                                .auffrischen(new String[] { programmFavorit
                                                        .getProgrammSchluesselID() });
                                    }
                                }
                            }
                            this.programme.add(obj);
                            this.addStatusMeldung(MeldungsTyp.NORMAL,
                                    "Erstellen eines neuen Tabs und Einbettung des Programms");
                            edStatusBar.getProgressBars().get(1).setValue(80);
                            String name = programmObjekt.getProgrammInfoText()
                                    + " (" + tabbedPaneProgrammme.getTabCount()
                                    + ")"; // TODO Nummern ab 1 beginnend und pro
                            // "Programm-Typ"? Also erst dann
                            // Nummerieren wenn z.B.
                            // zwei mal "Belege suchen" geöffnet ist
                            tabbedPaneProgrammme.addTab(name, (JPanel) obj);
                            tabbedPaneProgrammme.setTabComponentAt(
                                    tabbedPaneProgrammme
                                            .indexOfComponent((JPanel) obj),
                                    new ButtonCloseTab(tabbedPaneProgrammme,
                                            programme));
                            this.addStatusMeldung(MeldungsTyp.NORMAL,
                                    "Neuen Tab selektieren");
                            edStatusBar.getProgressBars().get(1).setValue(90);
                            if (tabbedPaneProgrammme.getTabCount() == 1) {
                                tabbedPaneProgrammme.setSelectedIndex(-1);
                            }
                            tabbedPaneProgrammme.setSelectedComponent((JPanel) obj);
                            this.addStatusMeldung(
                                    MeldungsTyp.NORMAL,
                                    "Programm gestartet: "
                                            + programmObjekt.getProgrammInfoText());
                            edStatusBar.getProgressBars().get(1).setValue(100);
                            Thread.sleep(200);
                            edStatusBar.getProgressBars().get(1).setValue(0);
                            edStatusBar.getProgressBars().get(1).setVisible(false);
                            this.addMeldungen(
                                    MeldungsTyp.OK,
                                    "Programm gestartet: "
                                            + programmObjekt.getProgrammInfoText());
                        } else {
                            this.addMeldungen(MeldungsTyp.WARNUNG, "Programm "
                                    + programmObjekt.getProgrammInfoText()
                                    + " konnte aufgrund mangelnder "
                                    + "Rechte nicht gestartet werden");
                        }
                    }
                } catch (Exception e1) {
                    // if (e1 instanceof EDMessageException) {
                    // EDMessageException e2 = (EDMessageException) e1;
                    //
                    // }
                    e1.printStackTrace();
                    this.addMeldungen(
                            MeldungsTyp.FEHLER,
                            "Fehler beim Starten des Programms "
                                    + programmObjekt.getProgrammInfoText() + ": "
                                    + e1.getMessage());
                    edStatusBar.getLabelInfo().setText(
                            "Fehler beim Starten des Programms "
                                    + programmObjekt.getProgrammInfoText() + ": "
                                    + e1.getMessage());
                    edStatusBar.getProgressBars().get(0).setValue(0);
                    edStatusBar.getProgressBars().get(1).setValue(0);
                    edStatusBar.getProgressBars().get(0).setVisible(false);
                    edStatusBar.getProgressBars().get(1).setVisible(false);
                }
            }
            this.meldungen.addMeldungenToTable();
        }

    Und in den Panels werden dann natürlich eine Reihe von Componenten aufgebaut. Ach übrigens hier mal noch ne generelle Frage wenn ich Grafiken mit
    Code :
    1
    2
    
    icon.setImage(icon.getImage().getScaledInstance(xImage, yImage,
                        Image.SCALE_DEFAULT));
    lade ist es besser die Grafiken schon vorher auf eine bestimmte Pixelzahl zu reduzieren oder ist das bei dieser vorgehensweise irrelevant bezüglich des Speichers?

    Zu guter Letzt hier noch mal eine Beispielgrafik um eine Vortsellung vom Unfang des Programms zu bekommen.


    Gruß Jan
    Geändert von ElJarno (01.10.10 um 08:03 Uhr)
     

  6. #21
    genodeftest genodeftest ist offline Mitglied Brillant
    Registriert seit
    Jun 2009
    Beiträge
    870
    Kleiner Tipp nebenbei: wenn das echte Daten sind, die man da sieht, würde ich das bild sofort löschen oder die Namen + Daten schwärzen. Nicht dass dein Chef dir böse wird
    Ansonsten solltest du erst einmal etwas Struktur in deinen Code bringen und ihn in mehrere Methoden auslagern. So wie der gerade hier im Forum steht, tut ihn sich keiner freiwillig an.
     

  7. #22
    ElJarno ElJarno ist offline Mitglied Silber
    Registriert seit
    May 2010
    Beiträge
    88
    Ja der Code sollte auch nur einen kleinen Einblick in das Programm gewähren wie ich die Panels für die Tabs generiere und diese dann an die TabbedPane hefte. Im Prinzip geschieht dort nichts anderes als das laden einer Klasse und von dieser mit newInstance ein neues Panel erstellen, einige Listener registrieren, Parameter setzen und dann dieses als Tap an die TabbedPane heften. Den Code jetzt sinnvoll zu zerpflücken macht keinen Sinn, da alles zusammenhängt. Ich wüsste jetzt auch keine sinnvollen Stellen die ich hier posten könnte an denen man vielleicht Problemstellen ausmachen könnte.
    Geändert von ElJarno (06.10.10 um 11:51 Uhr)
     

Ähnliche Themen

  1. Url Zerlegen und ein wert wieder geben!?
    Von harderph im Forum PHP
    Antworten: 6
    Letzter Beitrag: 26.03.08, 12:43
  2. 2 Abfragen aus 2 tabellen und dann in einer wieder geben?
    Von harderph im Forum Relationale Datenbanksysteme
    Antworten: 1
    Letzter Beitrag: 28.01.08, 22:04
  3. Speicher lässt sich nicht wieder frei machen
    Von Ivan der Schrecken im Forum VisualStudio & MFC
    Antworten: 0
    Letzter Beitrag: 17.10.04, 19:57
  4. Bilder wieder geben
    Von Arbeiter im Forum PHP
    Antworten: 6
    Letzter Beitrag: 06.08.04, 08:46
  5. Programm zum Speicher frei machen...
    Von mirscho im Forum Microsoft Windows
    Antworten: 7
    Letzter Beitrag: 05.11.02, 14:03