Hallo Leute,
ich habe hier schon viel gelesen, aber zu meinem Problem noch keine Lösung gefunden.
Kurz zu mir:
Meine Java Kenntnisse sind noch recht einfach. Kenne mich aber ganz pasabel mit C# (für ab und zu mal Hobbyprogrammieren) und C (für Mikroprozessor) aus. Linux ist für mich auch neu. Bisher nur DOS und Windows.
Auf dem PI läuft Rasbian (aktuelles NOOBS Image 1.3.4). Da ist Java 1.7.0_40 enthalten.
Mein Projekt: (noch nicht alles drin!)
Ich habe einen PI mit 512MB Ram. Dort lese ich per RS232 einen Datenstring aus, den ich von einem µC bekommen. Da sind Temperaturen, Feuchtigkeit, Druck und so weiter drin. Ist so ne Art Wetterstation. Empfangen werden zwei Strings mit jeweils ca. 250 Zeichen. Dafür nutze ich pi4j. Die Daten sollen auf der SD Card oder nem externen USB Stick gespeichert werden. Ich will aller 10-30s einen Datenstring speichern. Eventuell auch auf einem Web Server anzeigen. Das ist aber erstmal nur "nice to have".
Geschrieben wird das ganze in Eclipse Indigo und compillliert auf dem PI.Erstellt habe ich ein Standard Java Projekt wo ich pi4j als Libs eingebunden habe.
Mein Problem:
Ich habe ein Programm geschrieben wo ich aktuell die akt. Datum, akt. Uhrzeit, Mem Used, Mem Free, SD Card used und SD Card free speichere. Das läuft im Sekundentakt. Das Programm läuft auch recht gut,
ABER!:
wenn ich das Java Programm starte hat es laut "ps au" bereits 233156 VSZ (ist doch virtueller Ram, oder? und RSS von 12068 (habe ich noch nicht herrausgefunden was das ist). Das VSZ bleibt die ganze Zeit gleich. RSS erhöht sich langsam. Nach 2h ist es dann 13876. Bleibt dann aber relativ gleich. Das große Problem ist eher, dass der Ram halt mehr ausgelastet wird. Also beim Start habe ich z.B. 100Mb Ram ausgelastet. 10Mb nimmt er sofort und dann nach 2h sind es schon 115Mb. Nach drei Tagen sind es 270Mb. Länger habe ich es noch nicht laufen lassen. Ich bin auf dem PI nur mittels Putty drauf und PI läuft nur auf Konsole. Also ohne startx.
Es wird aber auch nie Ram freigemacht. Als würde der GC nicht laufen. Wenn ich das Programm anhalte, gibt er ungefähr 10Mb Ram frei. Der Rest bleibt in Nutzung. Bei ps au verschwindet der Prozess aber komplett. Wenn ich es dan wieder neu starte geht das gleich spiel wieder los. Er nimmt 10Mb sofort und den Rest dann Stück für Stück.
Wenn ich das Programm am PC laufen lasse, startet er laut Task Manager bei z.B. 12Mb, läuft dann bis ca. 13,8Mb voll und verringert sich auch ca. 1Mb und dann wieder bis 13,8Mb. So geht das den ganzen Tag. Auf dem PI geht es nur nach oben.
Mache ich irgendwo ein Fehler oder habe ich etwas übersehen.
Als Vorlage für meine Routinen nutze ich die Programmschnipsel hier: http://www.mkyong.com/tutorials/java-io-tutorials/ Die Erfassung der Zeit habe ich aus nem Java Buch. Ich gehe mal davon aus, das das daran nicht liegen kann.
Aber hier mal der Schnipsel:
// actual Date of the PI
public String aktDate() {
String DateText = new SimpleDateFormat("dd.MM.YYYY").format(new Date());
return DateText;
}
Er erzeugt damit zwar immer ne neue SimpleDateFormat, aber wen er das neu erzeugt, kann das alte ja vom GC weggelöscht werden, oder? Man soll ja den GC nicht einfach in nem Loop aufrufen. Das macht der doch selber, oder?
So erzeuge ich die Messdatei:
//Erzeugen einer neuen Messdatei + Entsprechendem Header
public void CreateNewFile(String headerdata) throws IOException {
File fileHandling = new File(archivfolderpath + "/" + filename);
try {
if(!fileHandling.exists()) {
fileHandling.createNewFile(); //Wenn es nicht existiert, erstellen
//System.out.println("File erstellt");
//Header schreiben
FileWriter WriteDataToFile = new FileWriter((archivfolderpath + "/" + filename), false);
BufferedWriter bufferWritter = new BufferedWriter(WriteDataToFile);
bufferWritter.write(headerdata + System.getProperty("line.separator"));
bufferWritter.close();
}
} catch (IOException ioe) {
System.out.println("Error Creating File" + ioe);
}
}
Display More
Ich habe auch mal das Programm in Java mittels *** -Xmx15m gestartet. Hat auch keine Änderung gebracht. Habe auch mal Java 8 probiert. Da isses das selbe. Also muss es ja an mir liegen.
Habt ihr evetuell ne Idee warum der immer mehr Ram frisst?
Danke euch.
Arno