tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
5
ZUGRIFFE
344
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    philippo philippo ist offline Mitglied Bronze
    Registriert seit
    May 2005
    Beiträge
    47
    Erstmal sorry für diesen plakativen Titel...
    Ich habe ein Mini-Programm geschrieben, das einfach nur eine Datei A ausliest und nach B schreibt. (Warum man sowas tut? Besser nicht fragen bitte....)
    Dieses soll Programm ununterbrochen laufen, daher die Schleife. 1x am Tag wird die Box neu gestartet. Das Problem ist, dass der Speicherbedarf der VM langsam aber sehr kontinuierlich ansteigt! Ich habe das jetzt 10 min. beobachtet: es begann bei 7,5 MB und benötigt inzwischen schon 9 MB.
    Es wäre wirklich super, wenn mir irgendjemand sagen könnte, ob dieser Code hier ineffizient ist und was ich sonst noch alles falsch gemacht habe! Ich bin kein professioneller Entwickler, will aber wirklich gerne dazulernen.
    Danke im Voraus.
    Hier ist der Code:
    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
    
     
    import java.io.*;
    import java.util.Properties;
     
    public class FileSync {
     
        /**
         * Dient der Realisierung einer Fileschnittstelle zwischen 2 MT-Instanzen 
         * Kopiert kontinuierlich eine Datei von a nach b.
         * 
         * params:
         * SyncPause
         * FilenameFrom (abs. Pfad)
         * FilenameTo (abs. Pfad)
         * 
         */
        
        public static void main(String[] args) {
            System.out.println("FileSync start");
            
            // StdErr in Datei umleiten     
            try
            {
              java.io.FileOutputStream outstream = new java.io.FileOutputStream("FileSyncErr.log");
              System.setErr(new java.io.PrintStream(outstream));
              // System.setOut(new java.io.PrintStream(outstream));
            }
            catch(Exception e){         
                System.out.println("Logging in Datei umleiten schlug fehl.");
                e.printStackTrace();
            }
            
            // Properties-Datei auslesen        
            File datei = new File("FileSync.properties");
            Properties fileProp = new Properties(); 
            
            System.out.println("\nDefaults setzen");
            int SyncPause=500;
            String strFilenameFrom = "C:\\send.txt";
            String strFilenameTo = "C:\\receive.txt";
            System.out.println("SyncPause=" + SyncPause);
            System.out.println("strFilenameFrom=" + strFilenameFrom);
            System.out.println("strFilenameTo=" + strFilenameTo);
             
            try {
                FileInputStream stream = new FileInputStream(datei);                        
                fileProp.load(stream);
                
                SyncPause = Integer.parseInt(fileProp.getProperty("SyncPause"));
                strFilenameFrom = fileProp.getProperty("FilenameFrom");
                strFilenameTo = fileProp.getProperty("FilenameTo");
                
                } 
            catch (FileNotFoundException e) {
                    System.out.println("Properties-Datei auslesen: File Not Found "+datei.getAbsolutePath());
                    e.printStackTrace();
                } 
            catch (Exception e2) {              
                    System.out.println("Properties-Datei auslesen: Unbekannter Fehler");
                    e2.printStackTrace();
                }
            System.out.println("\nProperties ausgelesen");
            System.out.println("SyncPause=" + SyncPause);
            System.out.println("strFilenameFrom=" + strFilenameFrom);
            System.out.println("strFilenameTo=" + strFilenameTo);
            
            File FilenameFrom = new File(strFilenameFrom);
            File FilenameTo = new File(strFilenameTo);
     
            // Ende
            while(true){
                copyFiles(FilenameFrom, FilenameTo);
                try {
                    Thread.sleep(SyncPause);
                    } catch (InterruptedException e){
                        System.out.println("Thread.Sleep führte zu error");
                        e.printStackTrace();
                    // the VM doesn't want us to sleep anymore,
                    // so get back to work
                    }
            }
            }
        
        static void copyFiles(File FilenameFrom, File FilenameTo){
            System.out.println("sync " + System.currentTimeMillis() / 1000);
            // Datei kopieren 
            if(FilenameTo.exists()) {
                FilenameTo.delete();
            }
            
            byte[] buffer = new byte[512];
            int read = 0;
            InputStream in = null;
            OutputStream out = null;
            try {
                in = new FileInputStream(FilenameFrom);
                out = new FileOutputStream(FilenameTo);
                while(true) {
                    read = in.read(buffer);
                    if (read == -1) {
                        //-1 bedeutet EOF
                        break;
                    }
                    out.write(buffer, 0, read);
                }
            }
            catch (Exception e){
                System.out.println("Fehler beim Kopieren");         
                e.printStackTrace();
            }
            finally {
                // Sicherstellen, dass die Streams auch bei einem throw geschlossen werden.
                // Falls in null ist, ist out auch null!
                if (in != null) {
                //Falls tatsächlich in.close() und out.close()
                //Exceptions werfen, wird die jenige von 'out' geworfen.
                    try {
                        in.close();
                    }
                    catch (Exception e) {
                        System.out.println("Fehler schließen eines Streams.");
                        e.printStackTrace();
                    }
                    
                    if (out != null) {
                        try {
                            out.close();
                        }
                        catch (Exception e) {
                            System.out.println("Fehler schließen eines Streams.");
                            e.printStackTrace();
                        }
                        
                    }
                }
            }
        }
    }
     

  2. #2
    Registriert seit
    Apr 2007
    Beiträge
    209
    Hast du mal mit einem Profiler geguckt? Was ist wenn du testweise die copy Methode rausnimmst? Steigt dann dein Speicherverbrauch trotzdem noch an
     

  3. #3
    philippo philippo ist offline Mitglied Bronze
    Registriert seit
    May 2005
    Beiträge
    47
    Sorry, was ist denn ein Profiler?

    Mir ist gestern noch was anderes eingefallen. Ich initialisiere das byte-Array zum kopieren ja mit 512 bytes. Die Zahl habe ich willkürlich gewählt, wie gesagt, ich bin kein professioneller Entwickler.... Kann der linear zunehmende Speicherverbrauch evtl. davon kommen?
     

  4. #4
    Anime-Otaku Anime-Otaku ist offline Mitglied Brillant
    Registriert seit
    Aug 2005
    Ort
    Karlsruhe (Baden-Württemberg)
    Beiträge
    905
    Wo wird denn outstream und stream geschlossen?
     
    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. #5
    philippo philippo ist offline Mitglied Bronze
    Registriert seit
    May 2005
    Beiträge
    47
    ...werden doch geschlossen!? Oder wie soll ich deine Frage verstehen?

    Jedenfalls habe ich heute etwas über den Garbage Collector gelernt
    Für den Speicherbedarf meines schönen Programms gibt es eine obere Grenze, für die der GC sorgt. Puh!
    Außerdem initiiere ich das byte-Array jetzt mi 2 byte.
    ---> Erledigt.
     

  6. #6
    Anime-Otaku Anime-Otaku ist offline Mitglied Brillant
    Registriert seit
    Aug 2005
    Ort
    Karlsruhe (Baden-Württemberg)
    Beiträge
    905
    Du schließt nur die Streams in und out, die anderen nicht.
     
    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/

Ähnliche Themen

  1. Antworten: 6
    Letzter Beitrag: 05.11.08, 15:04
  2. FireFox 2.0.0.6 unter WinXP frisst Speicher
    Von liquidbeats im Forum Microsoft Windows
    Antworten: 26
    Letzter Beitrag: 13.09.07, 02:36
  3. Unreal Ircd frisst zuviel Speicher
    Von Netzspinne im Forum Internetkommunikation
    Antworten: 0
    Letzter Beitrag: 27.06.06, 23:48
  4. Warum kann ich meinen Polycount nicht sehen?
    Von ivanhs37 im Forum Autodesk Maya (ehemals Alias)
    Antworten: 0
    Letzter Beitrag: 08.04.05, 19:59
  5. win98 frisst meinen ram******
    Von Master-T im Forum Microsoft Windows
    Antworten: 4
    Letzter Beitrag: 24.07.03, 12:41