tutorials.de Buch-Aktion 05/2012
Seite 1 von 4 1234 LetzteLetzte
ERLEDIGT
NEIN
ANTWORTEN
48
ZUGRIFFE
11133
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    flashray flashray ist offline Mitglied Rubin
    Registriert seit
    Sep 2005
    Ort
    Mannheim
    Beiträge
    1.325
    Hallo,

    verwendet ihr in euren Programmen eigentlich System.gc(). Wenn ich mit meinem Editor eine Große Textdatei lade, oder in der neu implementierten Druckvorschau blättere, oder zoome kommt es vor das:
    "Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space" !

    Ist es zu empfehlen, wenn man mit großen Daten seis String oder Images arbeitet, System.gc() aufzurufen? Wenn ja wie und wo sollte man ihn am besten implementieren?


    Vg Erdal
     

  2. #2
    flashray flashray ist offline Mitglied Rubin
    Registriert seit
    Sep 2005
    Ort
    Mannheim
    Beiträge
    1.325
    2. Frage zu Speicherverbrauch:

    JLabel label = new JLabel();
    label = null;
    label = new JLabel();

    Wird der GC den Speicher für das zuerst erstellte Objekt freigeben, weil keine Referenz darauf besteht, oder bleibt dieser weiterhin bestehen?

    3. Frage zu Speicherverbrauch:

    Was sind die häufigsten Fehler bei String und Image Operationen die den Speicher voll laufen lassen? Was wird oft vergessen?

    Welche Maßnahmen kennt ihr den Speicherverbrauch zu minimieren?

    Wo könnte ich einen Artikel oder ähnliches darüber lesen?


    Vielen Dank!

    Vg Erdal
     

  3. #3
    flashray flashray ist offline Mitglied Rubin
    Registriert seit
    Sep 2005
    Ort
    Mannheim
    Beiträge
    1.325
    Hallo Freunde,

    Was ist mit JMX, wäre sie hierfür hilfreich:

    4. Könnte man mit Hilfe von JMX ausfindig machen, welcher String, welches Image Objekt genau wieviel Speicher verbraucht, um genau die ineffiziente Stelle im Programm zu finden, um sie zu verbessern. Es würde auch reichen speicherfressende, belastende Objekte herauszufinden, um diese ressourcenschonender zu implementieren.


    Vg Erdal
     

  4. #4
    NomadSoul NomadSoul ist offline Mitglied Platin
    Registriert seit
    Nov 2002
    Ort
    Mannheim
    Beiträge
    544
    Blog-Einträge
    5
    Zu Frage 1:
    In einem Profiler siehst Du wie der Speicherverbrauch sinkt. Aber in einer Realen VM ist das System.gc() nur eine Empfehlung an den GC mal den Speicher zu untersuchen. Es ist nichtgarantiert das, dass auch passiert.
    Zu 2:
    Jain, es besteht zwar keine Referenz mehr auf dieses Objekt, allerdings läuft der GC nicht ständig mit. Somit kann es sein das dieses Objekt erst am Ende des Programms zerstört wird.
     
    Zitat Zitat von Benjamin Franklin
    Eine Gesellschaft die Freiheit zugunsten der Sicherheit opfert hat beides nicht verdient
    Kohlkopf
    -------------------------------------------------------------------------------------------
    .:Mitglied und offizieller Erdbeerenpflanzer des 1. offiziellen Sven Uwe Fan-Clubs:.

  5. #5
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo!

    Hallo!

    Ist es zu empfehlen, wenn man mit großen Daten seis String oder Images arbeitet, System.gc() aufzurufen? Wenn ja wie und wo sollte man ihn am besten implementieren?
    Eigentlich sollte man System.gc()-Aufrufe vermeiden. Wie NomadSould schon richtig sagte, wird bei einem System.gc() Aufruf nicht notwendigerweise
    ein GC ausgefuehrt. Der GC bekommt nur einen Hinweis, dass er an der naechsten Moeglichen Gelegenheit laufen soll.

    2. Frage zu Speicherverbrauch:

    JLabel label = new JLabel();
    label = null;
    label = new JLabel();

    Wird der GC den Speicher für das zuerst erstellte Objekt freigeben, weil keine Referenz darauf besteht, oder bleibt dieser weiterhin bestehen?
    Ob die erste JLabel-Instanz direkt vom GC freigegeben wird haengt u.a. davon ab, wie der Heap-Speicher derzeit ausgelastet ist.
    Ist dieser schon stark beansprucht, ist die Wahrscheinlichkeit hoeher, dass ein GC durchgefuehrt und die Instanz vom Heap entfernt wird.


    3. Frage zu Speicherverbrauch:

    Was sind die häufigsten Fehler bei String und Image Operationen die den Speicher voll laufen lassen? Was wird oft vergessen?

    Welche Maßnahmen kennt ihr den Speicherverbrauch zu minimieren?
    Die haeufigsten Fehler bei der Arbeit mit Objekten ist der, dass grosse Objekte
    (grosse Strings, grosse Bilder) ueber "harte" Referenzen laenger im Speicher behalten
    werden, als eigentlich notwendig. Ein weiterer haeufiger Fehler bei Swing oder allgemein
    GUI Anwendungen ist der, dass EventListener bei verschiedenen Widgets registriert,
    aber spaeter nicht mehr deregistriert werden, was das aufsammeln dieser durch den GC verhindert.

    Was ist mit JMX, wäre sie hierfür hilfreich:

    4. Könnte man mit Hilfe von JMX ausfindig machen, welcher String, welches Image Objekt genau wieviel Speicher verbraucht, um genau die ineffiziente Stelle im Programm zu finden, um sie zu verbessern. Es würde auch reichen speicherfressende, belastende Objekte herauszufinden, um diese ressourcenschonender zu implementieren.
    Das kannst du mit Standard JMX AFAIK nicht... dafuer musst du schon einen Profiler bemuehen der ueber das JVM TI (Tool Interface)
    in den Innereinen der JVM nachschaut.

    Gruss Tom
     
    Java rocks!
    How to become a good Java Programmer?
    Does IT in Java and .Net
    The only valid measurement of code quality: WTFs / minute
    Blog
    Xing
    Twitter

  6. #6
    flashray flashray ist offline Mitglied Rubin
    Registriert seit
    Sep 2005
    Ort
    Mannheim
    Beiträge
    1.325
    Hallo,

    herzlichen Dank an NomadSoul und Tom.

    Das war schon sehr Hilfreich.

    Eine letzte Frage hätte ich noch: "harte" Referenzen . Wie meinst du dass?

    Vg Erdal
     

  7. #7
    Avatar von tekilla209
    tekilla209 tekilla209 ist offline Mitglied Silber
    Registriert seit
    Apr 2007
    Beiträge
    60
    Genau: Was meinst Du mit "harten" Referenzen?

    Ich hab da nähmlich ein ähnliches Problem. Ich lese Daten aus einer großen Textdatei zeilenweise aus. Ich weis welche Daten in welcher Reihnfolge in der Text Datei stehen und will diese dann in eine Datenbank einspeisen.
    Also:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    BufferedReader br = new BufferedReader(new FileReader(importFile));
    while (line != null)
    {
        line = br.readLine();
        if (line == null) break;
        String[] tupels = line.split(";");
            ...
            hier kommt dann der DBImport mit aufteilung der Daten auf mehrere Tabellen;
            ....
    }
    br.close();

    Ich brauche ja eigentlich nie mehr als eine Zeile gleichzeitig im Speicher.
    wenn die textdatei größer als ca. 1300 Zeilen ist dann kommt:
    Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap space

    2. Frage: Wie kann ich die Anzahl der Zeilen aus einer Textdatei herausfinden?
    -> für JProgressBar.

    3. Frage: In einem anderen Prog will ich die Daten einer SQL-Tabelle in einer JTable mit JScrollPane anzeigen. Bei großen Tabellen habe ich dann auch wieder dieses Speicherproblem. Welche möglichkeit gibt es hier?
     

  8. #8
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    Hallo,

    ich denke mal das Tom mit "harten" Referenzen Variablen meint, die nicht erst in der Methode erzeugt werden, in der sie gebraucht werden, und nach der Methode wieder verschwinden, sondern welche die während der gesamten Laufzeit vorhanden sind und wenn diese natürlich viel Speicher brauchen, besetzen sie den Speicher die ganze Zeit.

    @tekilla
    ich denke mal dass bei dir wegen dem BufferedReader der OutOfMemoryError kommt. Der puffert ja den ganzen Text aus der Datei. Das ist aber halt nur eine Vermutung.
    Weißt du denn bei welcher Zeile der Error auftritt?

    MFG

    zEriX
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  9. #9
    Anime-Otaku Anime-Otaku ist offline Mitglied Brillant
    Registriert seit
    Aug 2005
    Ort
    Karlsruhe (Baden-Württemberg)
    Beiträge
    905
    Zum GC...dieser wird in der Regel nur ausgeführt, wenn der Heap Speicher voll läuft und hält damit die Applikation bei vielen Daten schonmal ne Sekunde auf. Dazu kommt es beim Heap Speicher Graphen zu einem Sägezahn.

    Wenn ihr das sehen wollt benutzt die JConsole, die ab Java 5 in der JDK dabei ist. (Bei 5 muss man einen Parameter zur Anwendung mitgeben um es benutzen zu können, bei 6 ist dies nicht nötig(außer bei jmx))

    Wenn der Speicher trotzdem nicht ausreicht solltet ihr euren Heap Speicher (und vielleicht andere Speicherbereiche) vielleicht erhöhen, dies lässt sich jedoch nur beim Starten der Anwendung festlegen.
    Simple. For example, the java option -Xmx768m gives it a 768MByte heap, maximum but starts with just a 2MB heap. You can add -Xms256m (for example) to make the heap start at 256MB - this can be more CPU efficient if your going to need that larger space anyway, but a waste if you don't.
    Dies erhöht jedoch nicht den permgen Speicherbereich, welches alle strukturellen Klassen/Methodeninfromationen bereithält.Dieser ist bei einer Anwendung normalerweise relativ konstant. Außer z.B. bei Testserver, wo man Sachen während dem Betrieb deployed/undeployed...jedoch gibt es auch einen alten jvm bug, dass beim undeployen nicht alle Daten entfernt werden. Dadurch kann es nach einigen "hot-deployments" zu einem OutOfMemory permgen kommen.
     
    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/

  10. #10
    limago limago ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Riedstadt (Hessen)
    Beiträge
    354
    Zitat Zitat von zerix Beitrag anzeigen
    Hallo,

    ich denke mal das Tom mit "harten" Referenzen Variablen meint, die nicht erst in der Methode erzeugt werden, in der sie gebraucht werden, und nach der Methode wieder verschwinden, sondern welche die während der gesamten Laufzeit vorhanden sind und wenn diese natürlich viel Speicher brauchen, besetzen sie den Speicher die ganze Zeit.

    @tekilla
    ich denke mal dass bei dir wegen dem BufferedReader der OutOfMemoryError kommt. Der puffert ja den ganzen Text aus der Datei. Das ist aber halt nur eine Vermutung.
    Weißt du denn bei welcher Zeile der Error auftritt?

    MFG

    zEriX
    Hi zerix,

    harte Referencen sind normale Referenzen. Wenn keine harten Referenzen auf ein Object zeigen wird es gelöscht. Ein "vergessener" Zeiger führt zu einem Speicherleck. Deshalb gibt es in Java auch weiche Refrenzen.

    Sieh mal hier:

    http://www.gruntz.ch/papers/references.pdf

    Gruss
     

  11. #11
    Avatar von zerix
    zerix zerix ist offline Hausmeister
    tutorials.de Moderator
    Registriert seit
    May 2005
    Beiträge
    4.335
    Naja, im Grunde genommen hab ich das ja gemeint.

    MFG

    zEriX
     
    Es ist schwer Allwissend zu sein. Aber ich komme damit klar. ;-)

  12. #12
    Avatar von tekilla209
    tekilla209 tekilla209 ist offline Mitglied Silber
    Registriert seit
    Apr 2007
    Beiträge
    60
    Zitat Zitat von zerix Beitrag anzeigen
    @tekilla
    ich denke mal dass bei dir wegen dem BufferedReader der OutOfMemoryError kommt. Der puffert ja den ganzen Text aus der Datei. Das ist aber halt nur eine Vermutung.
    Weißt du denn bei welcher Zeile der Error auftritt?

    MFG

    zEriX
    Wie kann ich readLine() ohne Bufferred Raeder implementieren?

    wie bereits erwähnt kommt der fehler bei ca 1300ter Zeil (wenn der Speicher eben Voll ist).
     

  13. #13
    limago limago ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Riedstadt (Hessen)
    Beiträge
    354
    Das kann nicht das Problem sein. Der BufferedReader puffert zwar den Strom, aber er liest nicht dasganze File auf einmal ein. Ich habe schon Gigabyte große Dateien damit verarbeitet, ohne Probleme.

    Zum Ermitteln der Zeilenzahl, wirst Du wohl die komplette Datei lesen müssen. Das geht mit Klassen aus dem java.nio Paket sehr schnell. Ich würde an Deiner Stelle schätzen. Die Zahl der Bytes kannst Du leicht ermitteln. Wenn Du ungefähr die Zahl der Bytes pro Zeile weisst, kannst Du damit die ProgressBar füttern.

    Gruß
     

  14. #14
    limago limago ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Riedstadt (Hessen)
    Beiträge
    354
    Nachtrag. Tom hat schon angedeutet, dass Du mal einen Profiler bemühen solltest. Dann kannst Du feststellen, wer überhaupt den Speicher frisst. Mit Java wird ein Profiler ausgeliefert:

    http://java.sun.com/developer/techni...ing/HPROF.html

    Das Programm sollte ordnungsgemäß beenden und wird durch den Profiler langsamer...

    Gruß
     

  15. #15
    Avatar von tekilla209
    tekilla209 tekilla209 ist offline Mitglied Silber
    Registriert seit
    Apr 2007
    Beiträge
    60
    Hab mal versucht keinen BufferredReader zu verwenden und readLine()
    wie folgt implementiert:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    FileReader fr = new FileReader(importFile);
    String line ="";
    char c;
    int i=0;
    do 
    {
        c = (char)fr.read();
        line += c;
        i++;
    }
    while (c != '\n');

    das bringt aber nix!
    ich hab immernoch mein Speicherproblem

    Bitte helft mir jemand
     

Ähnliche Themen

  1. Warenwirtschafts-System vs. ERP-System
    Von hikeda_ya im Forum Coders Talk
    Antworten: 2
    Letzter Beitrag: 15.09.10, 11:03
  2. system()
    Von Anfänger007 im Forum C/C++
    Antworten: 0
    Letzter Beitrag: 24.10.07, 12:21
  3. 2.1-System
    Von tittli im Forum Audiotechnik, Recording & Audio-Software
    Antworten: 3
    Letzter Beitrag: 27.09.07, 19:01
  4. System::Byte => System::String
    Von dertobian im Forum C/C++
    Antworten: 6
    Letzter Beitrag: 25.08.07, 18:57
  5. Was für ein System
    Von MediaPlanet im Forum PHP
    Antworten: 3
    Letzter Beitrag: 25.08.03, 00:03