ERLEDIGT
JA
JA
ANTWORTEN
5
5
ZUGRIFFE
344
344
EMPFEHLEN
-
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(); } } } } } }
-
Hast du mal mit einem Profiler geguckt? Was ist wenn du testweise die copy Methode rausnimmst? Steigt dann dein Speicherverbrauch trotzdem noch an
-
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?
-
08.08.08 15:28 #4
- 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:
[java]System.out.println("Hello World");[/java]Code java:1
System.out.println("Hello World");
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/
-
...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.
-
09.08.08 14:21 #6
- 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:
[java]System.out.println("Hello World");[/java]Code java:1
System.out.println("Hello World");
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
-
ich überlasste wohl meinen Server, aber weiß nicht warum
Von BMo im Forum PHPAntworten: 6Letzter Beitrag: 05.11.08, 15:04 -
FireFox 2.0.0.6 unter WinXP frisst Speicher
Von liquidbeats im Forum Microsoft WindowsAntworten: 26Letzter Beitrag: 13.09.07, 02:36 -
Unreal Ircd frisst zuviel Speicher
Von Netzspinne im Forum InternetkommunikationAntworten: 0Letzter Beitrag: 27.06.06, 23:48 -
Warum kann ich meinen Polycount nicht sehen?
Von ivanhs37 im Forum Autodesk Maya (ehemals Alias)Antworten: 0Letzter Beitrag: 08.04.05, 19:59 -
win98 frisst meinen ram******
Von Master-T im Forum Microsoft WindowsAntworten: 4Letzter Beitrag: 24.07.03, 12:41





Zitieren
Login





