tutorials.de Buch-Aktion 05/2012
Seite 5 von 6 ErsteErste ... 23456 LetzteLetzte
Like Tree5Danke
ERLEDIGT
NEIN
ANTWORTEN
85
ZUGRIFFE
23447
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #61
    Registriert seit
    Jun 2002
    Ort
    Saarbrücken (Saarland)
    Beiträge
    9.886
    Blog-Einträge
    29
    Hallo,

    okay, habs mit dem unter Ubuntu 64 Bit mit dem Open JDK 1.6.0_0 laufen lassen.

    Damit das Problem auf jeden Fall auftritt reduzieren wir die Heap Size mal auf 48 MB. -Xmx48m

    @limago:
    Achtung Spoiler:

    Die Liste zu entfernen und nachträglich wieder hinzuzufügen ist keine zuverlässige Lösung... -> mit kleineren Heap Konfiguration gibt es trotzdem OOMEs. Ich bekomme auch mit 256 MB OOME's bei deiner Lösung.


    @All
    Achtung Spoiler:

    die Ursache für den OOME liegt in der Implementierung der Liste...
    Vielleicht machen ja manche Methoden nicht ganz das was man von ihnen erwartet...


    Gruß 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

  2. #62
    limago limago ist offline Mitglied Brokat
    Registriert seit
    May 2007
    Ort
    Riedstadt (Hessen)
    Beiträge
    354
    Das hier ist sicher nicht in Toms Sinn erfüllt aber alle Foderungen * grins *

    Achtung Spoiler:

    package de.tutorials;


    import java.util.List;

    public class MemoryLeakExample {
    public static void main(String[] args) {
    List<List<?>> lists = new ArrayList<List<?>>();

    for(int i = 0; i < 100;i++){
    List<Integer> list = new ArrayList<Integer>();

    for(int j = 0; j < 1000000;j++){
    list.add(j);
    }
    lists.add(list);

    System.out.println(i);
    list.clear();
    //?


    }

    System.out.println(lists);
    }

    static class ArrayList<T> extends java.util.ArrayList<T> {
    public boolean add( T element) {
    if (element instanceof List)
    super.add(element);
    return true;}
    }
    }

     
    I didn't write this; a very complex macro did.

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

    Das hier ist sicher nicht in Toms Sinn erfüllt aber alle Foderungen * grins *
    Ist auch nicht wirklich gültig, da der Code nicht an der Stelle des ? eingefügt wurde... -> Regeln erweitert / klarer gemacht

    Gruß 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

  4. #64
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    Hmm...

    Achtung Spoiler:
    i = 100;


    Ich denke richtig ist:
    Achtung Spoiler:
    ((ArrayList<Integer>)list).trimToSize( );
    clear() setzt nur die Elemente im Array der ArrayList auf null und die Größe auf 0, aber behält die Größe des Arrays bei. Daher bleibt der Speicher auch reserviert.
     

  5. #65
    Technoblade Technoblade ist offline Mitglied Gold
    Registriert seit
    Feb 2009
    Beiträge
    193
    Hat zwar nen bisschen gedauert bis ich drauf gekommen, aber wohl eher weil ich das Problem überschätzt habe. Hier meine Lösung:

    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
    
    [COLOR="whitesmoke"]
    import java.util.ArrayList;
    import java.util.List;
     
    public class MemoryLeakExample {
        public static void main(String[] args) {
            List<List<?>> lists = new ArrayList<List<?>>();
           
            for(int i = 0; i < 100;i++){
                List<Integer> list = new ArrayList<Integer>();
               
                for(int j = 0; j < 1000000;j++){
                    list.add(j);
                }
                lists.add(list);
               
                System.out.println(i);
                list.clear();
                i = 100;
            }
           
            System.out.println(lists);
        }
    }
    [/COLOR]
     

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

    die Schleifenvariablen zu manipulieren ist nicht wirklich eine Lösung... oder würdet ihr etwa so ein Speicherproblem in production code lösen? Durch verändern der Business Logic? In den meisten Fällen wird das wohl keine so gute Idee sein...

    Gruß 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

  7. #67
    Anime-Otaku Anime-Otaku ist offline Mitglied Brillant
    Registriert seit
    Aug 2005
    Ort
    Karlsruhe (Baden-Württemberg)
    Beiträge
    905
    Achtung Spoiler:

    Habe die Liste die geleert wurde wieder auch von der array size gestaucht. Bei mir gehts mit 48MB heap(und weniger) auf Windows 7 & sun jre 6-17 auf x86_64 bit Maschine

    package de.tutorials;

    import java.util.ArrayList;
    import java.util.List;

    public class MemoryLeakExample {
    public static void main(String[] args) {
    List<List<?>> lists = new ArrayList<List<?>>();

    for(int i = 0; i < 100;i++){
    List<Integer> list = new ArrayList<Integer>();

    for(int j = 0; j < 1000000;j++){
    list.add(j);
    }
    lists.add(list);

    System.out.println(i);
    list.clear();
    //+
    ArrayList<?> ar = (ArrayList<?>) list;
    ar.trimToSize();
    //-
    }

    System.out.println(lists);
    }
    }
     
    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/

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

    ein Aufruf von trimToSize() war natürlich des Rätsels Lösung.

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
    package de.tutorials;
     
    import java.util.ArrayList;
    import java.util.List;
     
    public class MemoryLeakExample {
        public static void main(String[] args) {
            List<List<?>> lists = new ArrayList<List<?>>();
            for(int i = 0; i < 100;i++){
                List<Integer> list = new ArrayList<Integer>();
                
                for(int j = 0; j < 1000000;j++){
                    list.add(j);
                }
                lists.add(list);
                
                System.out.println(i);
                list.clear();
                ((ArrayList<?>)list).trimToSize();
            }
            System.out.println(lists);
        }
    }

    Das Beispiel sollte nochmal vor Augen führen, dass auch in Code der auf den ersten Blick sauber ausschaut üble Memory Leaks verborgen sein können die man nur durch genaue Kenntnisse der Implementierungsdetails der Java API auflösen kann.

    Andere Collection Klassen wie HashMap, LinkedHashMap, ConcurrentHashMap etc. haben dieses Problem auch, bieten jedch keine Möglichkeit nachträglich die internen Strukturen (hier Hash-Buckets / Segments) zu stutzen.

    TreeMap hat dieses Problem IMHO nicht. Dort wird beim clear() die Referenz auf den zugrundeliegenden RB-Tree (RedBlack) null gesetzt, so dass die internen Strukturen, soweit nicht mehr sonstwie referenziert, vom GC aufgesammelt werden können.

    Code java:
    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
    
    package de.tutorials;
     
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.LinkedHashMap;
    import java.util.List;
    import java.util.Map;
    import java.util.TreeMap;
    import java.util.concurrent.ConcurrentHashMap;
     
    public class MemoryLeakExample {
        public static void main(String[] args) {
            List<Map<?,?>> maps = new ArrayList<Map<?,?>>();
            for(int i = 0; i < 100;i++){
                Map<Integer, Integer> map = 
                    new TreeMap<Integer, Integer>(); //Läuft durch
                    //new HashMap<Integer, Integer>(); //OOME
                    //new LinkedHashMap<Integer, Integer>(); //OOME
                    //new ConcurrentHashMap<Integer, Integer>(); //OOME
                
                for(int j = 0; j < 100000;j++){
                    map.put(j,j);
                }
                maps.add(map);
                
                System.out.println(i);
                map.clear();
                System.out.println(map);
            }
            System.out.println(maps);
        }
    }

    Gruß 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

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

    zum Jahres auftakt gibts dann mal ein neues (einfaches) Rätsel:

    Gegeben:
    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    
    package de.tutorials;
     
    import java.util.LinkedHashMap;
    import java.util.Map;
     
    public class LRUMapExample {
        public static void main(String[] args) {
            int maxEntriesToKeep = 10;
            
            Map<Integer, Integer> lruMap = new LinkedHashMap<Integer, Integer>();
     
            for (int i = 0; i < 1000; i++) {
                lruMap.put(i, i);
            }
     
            System.out.println(lruMap);
        }
    }

    Wie macht man hier am einfachsten aus einer LinkedHashMap eine LRU Map (Last Recently Used) welche sich nur die letzten 10 hinzugefügten Elemente merkt?

    Um dann folgende Ausgabe zu erzeugen:
    Code :
    1
    
    {990=990, 991=991, 992=992, 993=993, 994=994, 995=995, 996=996, 997=997, 998=998, 999=999}
    ?

    Viel Spaß und ein frohes neues Jahr allerseits

    Gruß 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

  10. #70
    Avatar von zeja
    zeja zeja ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Sep 2006
    Beiträge
    2.962
    Nice...

    Achtung Spoiler:

    import java.util.LinkedHashMap;
    import java.util.Map;

    public class LRUMapExample {

    public static void main(String[] args) {
    final int maxEntriesToKeep = 10;

    Map<Integer, Integer> lruMap = new LinkedHashMap<Integer, Integer>( ) {
    @Override
    protected boolean removeEldestEntry(
    java.util.Map.Entry<Integer, Integer> eldest) {
    return this.size( ) > maxEntriesToKeep;
    }
    };

    for (int i = 0; i < 1000; i++) {
    lruMap.put(i, i);
    }

    System.out.println(lruMap);
    }

    }
     

  11. #71
    DEV DEV ist offline Mitglied
    Registriert seit
    Dec 2010
    Beiträge
    11
    Hallo,

    bin mir nicht ganz sicher ob ich deine Aufgabenstellung richtig verstehe *schäm*, aber wie wärs mit:

    Code :
    1
    2
    3
    
            for (int i = 1000-maxEntriesToKeep; i < 1000; i++) {
                lruMap.put(i, i);
            }

    ?

    Gruß
    DEV
     

  12. #72
    AAF AAF ist offline Mitglied
    Registriert seit
    Mar 2007
    Ort
    Luzern (Luzern)
    Beiträge
    14
    Dann kannst du gleich folgendes verwenden:
    Code :
    1
    2
    3
    
    for (int i = 990; i < 1000; i++) {
        lruMap.put(i, i);
    }

    PS: Die Frage ist schon knapp ein Jahr alt..
    Geändert von AAF (06.12.10 um 13:51 Uhr)
     
    Schöne Grüsse aus der Schweiz,

    Adrian Ambros Frey

  13. #73
    DEV DEV ist offline Mitglied
    Registriert seit
    Dec 2010
    Beiträge
    11
    PS: Die Frage ist schon knapp ein Jahr alt..
    Oh mann, das passiert mir heute schon das zweite mal

    Das passiert, weil unter den Threads immer so komische Vorschläge mit ähnlichen Threads kommen; leider sind die wohl größtenteils alt ....

    Gruß
    DEV
     

  14. #74
    Avatar von MAN
    MAN MAN ist offline Mitglied Brokat
    Registriert seit
    Mar 2004
    Beiträge
    426
    Auch wenn es jetzt schon ein Jahr her ist: was spricht gegen ein neues Rätsel?

    Thema: Annotations

    Gegeben ist die folgende Klasse:

    Code java:
    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
    
    package de.tutorials;
     
    import java.util.Date;
     
    public class AnnotationExample {
        private static String supUnused1 = "unused";
        private static String supDeprecation1 = "deprecation";
        private static final String supUnused2 = "unused";
        private static final String supDeprecation2 = "deprecation";
        private static final String[] suppressArray = { "unused", "deprecation" };
     
        public static void main(String[] args) {
            // Test 1
            @SuppressWarnings( { "unused", "deprecation" })
            new Date().getDay();
     
            // Test 2
            @SuppressWarnings( { "unused", "deprecation" })
            int a = new Date().getDay();
     
            // Test 3
            @SuppressWarnings( { supUnused1, supDeprecation1 })
            int b = new Date().getDay();
     
            // Test 4
            @SuppressWarnings( { supUnused2, supDeprecation2 })
            int c = new Date().getDay();
     
            // Test 5
            @SuppressWarnings(suppressArray)
            int d = new Date().getDay();
        }
    }

    Die Fragen sind:
    - wie reagiert der Compiler mit Java 1.6?
    - welche Tests funktionieren, welche nicht und warum nicht?
    Der Code sollte wenns geht nicht vorher ausgeführt werden

    Viel Spaß beim Knobeln (oder Wissen )!

    Viele Grüße,
    MAN
    Geändert von MAN (20.03.11 um 22:32 Uhr)
     
    BLT - Die Bundesliga Tabelle der Saison 2011 / 2012 - http://www.spacehoster.de/blt/ NEU: mit Tippspiel!
    EMail: mstangel@gmx.de

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

    wie sollen wir denn die Lösung angeben...?
    Hier kommen mehere Dinge zusammen die man aber IMHO etzten endes aber alle unter der Kategorie Syntaxfehler abtun kann, wobei einige Fehler offensichtlich sind und andere eher subtil daher kommen

    Gruß 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

Ähnliche Themen

  1. Rätsel
    Von Layna im Forum Smalltalk
    Antworten: 5
    Letzter Beitrag: 18.11.04, 19:11
  2. Rätsel
    Von Olli-Web im Forum Fun-Forum
    Antworten: 6
    Letzter Beitrag: 01.05.04, 14:27
  3. Rätsel
    Von reBourne im Forum Smalltalk
    Antworten: 6
    Letzter Beitrag: 30.09.03, 13:23
  4. 3 Rätsel
    Von mslap im Forum Fun-Forum
    Antworten: 5
    Letzter Beitrag: 07.08.03, 11:35
  5. Ist mir ein Rätsel
    Von Eric25 im Forum HTML-Editoren
    Antworten: 3
    Letzter Beitrag: 25.04.02, 09:03