# Java-Programm verbraucht zu viel RAM



## sewagii (7. Apr 2014)

Hi,

ich hab momentan ein Problem mit Java in Verbindung mit dem Raspberry Pi.
Es geht darum, dass ich mehrere kleine JavaProgramme auf dem Teil (<500MB Ram) laufen lassen möchte.

Ich hab aber das Problem,dass beim Starten eines Java-Programms gleich mal > 150MB geschnappt werden. Ich vermute es hat was mit der SQ-Lite Datenbank zu tun. Eine simpls Textausgabeprogramm braucht nur ein paar MB.


```
public class StatusMain 
{
	public static void main(String[] args) 
	{
		Timer timer = new Timer();
		
		try {Class.forName("org.sqlite.JDBC");} 
			catch (ClassNotFoundException e) {e.printStackTrace();}
		
		try {timer.schedule(new StatusEinlesen(DriverManager.getConnection("jdbc:sqlite:RaspberryDatenbank2.db")), 0, 1000*60*3);} 
			catch (SQLException e) {e.printStackTrace();}
	}
}
```

In StatusEinlesen wird im Grunde nur ein Insert Befehl gemacht, daran wird es wohl kaum liegen. Der Timer wird es vermutlich auch nicht sein, weshalb ich auf irgendwas mit der SQ-Lite Datenbank tippe.

mfg


----------



## Natac (7. Apr 2014)

sewagii hat gesagt.:


> In StatusEinlesen wird im Grunde nur ein Insert Befehl gemacht, daran wird es wohl kaum liegen. Der Timer wird es vermutlich auch nicht sein, weshalb ich auf irgendwas mit der SQ-Lite Datenbank tippe


Solche Annahmen können dir ganz böse in den Rücken fallen. Zeig den Code von "StatusEinlesen" und wir können beurteilen, ob es das wirklich nicht sein kann.


----------



## Ruzmanz (7. Apr 2014)

> Ich hab aber das Problem,dass beim Starten eines Java-Programms gleich mal > 150MB geschnappt werden.



Hast du den deiner JRE auch mitgeteilt, wie viel RAM dein Programm maximal benötigt? Z.B. java - How to set the maximum memory usage for JVM? - Stack Overflow

Es könnt auch sein, dass du die normale JRE nutzt. Vielleicht klappt es mit der Embedded Version? Getting Started with Java SE Embedded on the Raspberry Pi


----------



## sewagii (7. Apr 2014)

Ich hab die Java-Version genutzt die schon mit dem Raspberry Pi Betriebsystem (Raspbian) mitgeliefert wurde.

StatusEinlesen lade ich heute noch hoch, den Code habe ich gerade nicht da. Aber es tritt  bei zwei Programmen auf die mit der SQLite Datenbank arbeiten. Bei dem einen Programm ist es wirklich nur ein insert into...(aktuelle Systemzeit, Temperatur des Raspberry Pi) und bei dem anderen Programm rufe ich nur eine Webseite auf und lese nur was aus den Quelltext aus und inserte das Ergebniss dann in die Datenbank.

Festgelegt wie viel RAM das Programm benötigt habe ich nicht. Eigentlich sollte es alleine gehen, bzw. 150MB sind auch viel zu viel. Ich hab versucht das Programm mit den Parametern Xmx und Xms zu starten hat aber auch nix gebracht.


----------



## sewagii (7. Apr 2014)

Das Problem liegt bei _DriverManager.getConnection("jdbc:sqlite:RaspberryDatenbank2.db")_.
Ich hatte alles auskommentiert und bin dann Schritt für Schritt vorgegangen.

Sobald da eine Connection erstellt wird benötigt er extrem viel RAM. Ich kann mir aber nicht erklären woher das kommt.


----------



## Natac (10. Apr 2014)

Könnte mir vorstellen, dass da die SqLite Datenbank aktiv wird. Vielleicht kannst du Datenbank noch etwas konfigurieren!?


----------



## nvidia (10. Apr 2014)

Probier halt eine andere DB aus, vll. H2?


----------



## djafix (10. Apr 2014)

ich kann mir nicht vorstellen dass es direkt an sqlite liegt, da das ja nichtmal eine richtige datenbank ist,sondern eher ein dateiformat...das heißt, dass dort auch kein server gestartet wird.

was allerdings mit hoher wahrscheinlichkeit sein kann, ist dass der drivermanager einfach soviel ram benötigt..daran wirst du wohl nicht viel ändern können  ob sich bei einer anderen datenbank was daran ändern würde, kann ich nicht sagen, ich glaube jedoch dass es da ähnlich aussehen würde


----------



## Androbin (12. Apr 2014)

Wichtig beim Thema RAM sparen ist, dass man die primitiven Datentypen richtig vergibt:
Hat man nun zum Beispiel einen int und deklariert ihn als long, so verbraucht man damit je nach Häufigkeit  dieser Variablen viel mehr RAM! anstatt eines int genügen meist auch ein short oder auch nur ein byte !!!


----------

