# Speicherverbrauch von Java / VM sehr hoch?



## Oli (27. Aug 2008)

Hallo,

ich habe ein kleines Problem. Ich habe eine Mini-Anwendung, die nix anderes macht als ein paar Daten aus einer Datenbank zu holen und diese dann in einer Tabelle darstellt.
Naja ein paar Berechnungen und ein bisschen Sortieren und Filtern ist auch dabei, des wars dann aber auch schon.

Wenn ich diese Applikation starte und noch KEINE Daten geladen habe, braucht das Teil 32 MB im Hauptspeicher. Das kommt mir jetzt ein bisschen viel vor, wenn ich ehrlich bin. Ich habe sämtliche imports, die mit einem * rausgeschmissen und durch die direkten imports ersetzt, leider ohne Erfolg. 

Also scheint ja wirklich nur das in den Hauptspeicher geladen zu werden, was tatsächlich gebraucht wird. Aber das können doch keine 32 MB sein, für eine solche Fuzzy-Anwendung, oder??
Hat jemand nen Tipp wie man das minimieren kann, bzw. ist das nomal??

Grüße Oli


----------



## Verjigorm (27. Aug 2008)

Ich seh schon die "Glaskugel-Kommentare"


----------



## tfa (27. Aug 2008)

Ja, die VM braucht eben einiges an Speicher. 32MB halte ich aber noch für ziemlich wenig.


----------



## Wildcard (27. Aug 2008)

> Ich habe sämtliche imports, die mit einem * rausgeschmissen und durch die direkten imports ersetzt, leider ohne Erfolg.


Was hast du dir davon erhofft? Es gibt keine imports im Bytecode das ist nur eine Kurzschreibweise. Völlig egal ob du *, oder den Klassennamen verwendest, oder die komplette Klassenbibliothek importierst.


----------



## 0x7F800000 (27. Aug 2008)

Verjigorm hat gesagt.:
			
		

> Ich seh schon die "Glaskugel-Kommentare"


Deine Glaßkugel liefert dir Informationen über die Vorhersagen von anderen Glaßkugeln?
Du hast also eine Metaglaßkugel??  ???:L


----------



## Verjigorm (27. Aug 2008)

Andrey hat gesagt.:
			
		

> Verjigorm hat gesagt.:
> 
> 
> 
> ...



Nee, sondern ne "super"-Glaskugel.
Alle Anderen sind von dieser abgeleitet


----------



## Oli (27. Aug 2008)

Hallo Wildcard,

jo hab ich auch gemerkt, ich komme, wie schon öfters erwähnt aus der C# - Ecke und bin noch nicht so tief in die Java-Welt eingetaucht.
Das nächste Problem, das ich habe ist eben auch, dass dieses Programm fast 6MB als JAR und 17MB unkopmprimiert hat. Nun das liegt haupsächlich an dem Datenbanktreiber (4MB). Gibt´s denn ne Möglichkeit, dass nur die benötigten Klassen und die dazugehörigen Referenzen ausgeliefert werden? (Im Moment wird das Jar - File mit FatJar gebastelt. Gibt´s da auch komfortablere Lösungen?

Grüße Oli


----------



## 0x7F800000 (27. Aug 2008)

...und diese ist als Observer bei allen Instanzen der Unterklasse abgemeldet oder wie jetzt?  :shock:


----------



## Wildcard (27. Aug 2008)

Warum sollte der Datenbank Treiber größer als nötig sein? Das Zeug wirst du schon brauchen.
Die Sache mit FatJAR würde ich mir übrigens genau überlegen, dann nicht jede Lizenz erlaubt dir Änderungen (und neu Verpacken ist eine Änderung).


----------



## Oli (27. Aug 2008)

Hallo Wildcard,

hm. wie soll ich denn sonst ein JAR - File generieren. Selbst wenn ich das über ein Ant - Script mache, ist es ja neu verpacken, oder?
Ok, Datenbanktreiber war wohl flasch ausgedrückt. Datenbank-Package mit vielen Klassen (unter anderem eben der Treiber). Und 90% dieser Klassen brauch ich eben nicht. 
Gut ne Lösung wäre halt per Hand aus der Package werfen, aber des ist mir zu aufwendig. 

Grüße Oli


----------



## maki (27. Aug 2008)

32 MiB sind viel???
17 MiB sind zuviel???

Sorry, kann ich nicht nachvollziehen.

Gruß,

maki (<- welcher seit 2 Jahren ein Handy mit einer 1GiB microSD Karte hat)


----------



## Oli (27. Aug 2008)

Hallo,

es soll ja vorkommen, dass es in besstimmten Betrieben noch Rechner gibt, die nur 256 MB RAM haben. Und auch nicht die schnellsten sind. Aber eben schnell genug, dass Leute dort z.B. Buchungen vornehmen können. Die Rechner laufen schon nahe an der Grenze aber sie funktionieren noch einwandfrei.
Ich wollte halt keine Applikation ausliefern, die ein paar Tabellen anzeigt und dafür 17MB RAM verbrauccht.
Egal, ich mach des jetzt mal zum Spaß mit .net und werde dann berichten wieviel RAM des benötigt...

Grüße Oli


----------



## maki (27. Aug 2008)

> Egal, ich mach des jetzt mal zum Spaß mit .net und werde dann berichten wieviel RAM des benötigt..


Kannst du doch gar nicht ermitteln, da die meisten Bibliotheken als Teil des OS mitgeliefert sind (Wieviel GiB baraucht Vista ) und genauso als Teil des OS RAMs angezeigt werden.

Übrigens wirst du mit Java selten nur bei 32 MB bleiben, 64 sind selbst für kleinere Anwendungen normal, da die JVM eben Speicher vorbelegt. Kannst aber mit JMX den echten RAM verbrauch deiner Java App ermitteln.


----------



## Wildcard (27. Aug 2008)

> hm. wie soll ich denn sonst ein JAR - File generieren. Selbst wenn ich das über ein Ant - Script mache, ist es ja neu verpacken, oder?


Du sollst Fremdbibliotheken eben genau nicht in dein Jar verpacken, sondern in zB einem lib Verzeichnis ausliefern. Dort kannst du dann auch die Lizenzen für die jeweilige Bibliothek ablegen.



> Ok, Datenbanktreiber war wohl flasch ausgedrückt. Datenbank-Package mit vielen Klassen (unter anderem eben der Treiber). Und 90% dieser Klassen brauch ich eben nicht.
> Gut ne Lösung wäre halt per Hand aus der Package werfen, aber des ist mir zu aufwendig.


Und woher weißt du, das die 10% die du verwendest nicht die anderen 90% benötigen?

@maki
Ach, bin ich froh die korrekte Verwendung der Binärpräfixe zu sehen   
In letzter Zeit fällt auch bei vielen Applikationen endlich der Groschen, nur bei MS wird's wohl wie üblich wieder ein wenig länger dauern...


----------



## Oli (27. Aug 2008)

Hi,

auch das ist mir durchaus bewusst. Aber die Bibliotheken liegen eben schon im Speicher. Ob sie gebraucht werden oder nicht. 
Ich will hier ja auch keine Diskussion über Windows vom Zaun brechen. Es geht eben darum, dass die App auf ca 40 älteren Rechnern laufen soll. Und deswegen soll sie so sparsam wie möglich mit den vorhandenen Ressourcen umgehen. Das ist auch schon alles. Wenns mit Java eben net machbar ist unter 5MB zu bleiben, muss ich andere Lösungen suchen. Zur Not mach ich des mit C++, da bleib ich mit Sicherheit unter 1MB.

Grüße Oli


----------



## Wildcard (27. Aug 2008)

Oli hat gesagt.:
			
		

> auch das ist mir durchaus bewusst. Aber die Bibliotheken liegen eben schon im Speicher. Ob sie gebraucht werden oder nicht.


Sagt wer? Die kommen in den Speicher wenn sie gebraucht werden und nicht vorher. Nur kannst du daran eben keinen Unterschied im Resourcenverbrauch machen.


----------



## Oli (27. Aug 2008)

Also das halte ich wiederum für ein Gerücht. Meines Wissens verwendet Java Static Binding. Und da wird eben alles in ByteCode umgewandelt und in den Speicher geknallt. DynamicBinding wäre hier besser. Nur ist es halt sehr aufwendig zur Laufzeit die Bibliotheken zu laden, die gebraucht werden...


----------



## Wildcard (27. Aug 2008)

Java lädt Klassen nach sobald sie angefragt werden (was mit dem Binding nichts zu tun hat). Hier ging es aber nicht um Java, sondern um Windows Bibliotheken, die eben auch nicht auf Verdacht in den Speicher geladen werden, sondern wenn sie gebraucht werden.
Allerdings ist das dann ein anderer Speicherbereich als der des C# Programms, was den Resourcen-Vergleich schwierig macht.


----------



## SchonWiederFred (27. Aug 2008)

Oli hat gesagt.:
			
		

> Ok, Datenbanktreiber war wohl flasch ausgedrückt.


Erschreckend: Der durchschnittliche Deutsche schreibt etwa jedes zehnte Wort flasch!


----------



## Oli (27. Aug 2008)

Wer Rechtschreibfehler findet darf sie behalten.


----------



## SchonWiederFred (27. Aug 2008)

Darf ich auch, Interpunktionsfehler behalten? :wink:


----------



## maki (27. Aug 2008)

> Zur Not mach ich des mit C++, da bleib ich mit Sicherheit unter 1MB.


Das halte ich für ein Gerücht 

Früher konnte man in VC++ noch die Bibliotheken statisch linken, da hat man dann gesehen wie groß das Ding wirklich ist, anstatt ein paar hundert KiB plötzlich mehrere MB groß, speziell wenn man Dinge wie ActiveX Komponenten nutzt. Mit dynamischer Bindung sieht man das nämlich nicht.

Wenn du C verwenden würdest wäre es zumindest theoretisch machbar, aber wer macht das heute noch wegen ein paar MB...

Naja,, 5MB und Java geht nicht, da hätte ein Blick auf die Anfporderungen schon genügt:


> System Requirements
> 
> # Windows 98 (1st and 2nd edition) or
> 
> ...


Ansonsten glaube ich auch dass so ein Vergleich ganz schnell als "Windows vs. richtige Betriebssysteme" endet.



> @maki
> Ach, bin ich froh die korrekte Verwendung der Binärpräfixe zu sehen icon_biggrin.gif


Dem TS scheint es ja um jedes KiB zu gehen


----------



## Oli (27. Aug 2008)

@SchonWiederFred:
nein die sind Lizenzpflichtig

@maki:
Die App ist nun in c++ geschrieben und braucht tatsächlich 7MB inklusive dem Laden der Daten. Habs auch schon auf dem Zielsystem getestet, das geht jetzt nicht meh in die Knie.
Mir ist durchaus bewusst, dass das ein Ausnahmefall ist. Aber mit der momentanen Lösung kann ich und mein Auftraggeber leben.

Und Windows vs. andere Betriebsysteme ist ein Vergleich der hinkt. Denn ich programmiere ja net für mich sondern für Kunden. Und die haben eben Windws-Rechner (vermutlich 95% aller Firmen in D - aber wie gesagt VERMUTLICH). Das kann ich leider nicht ändern und ich muss damit leben. 

Grüße Oli


----------



## maki (27. Aug 2008)

Klar ist Windows in der Überzahl, aber ich habe persönlich seit 4-5 Jahren keine Maschine mit nur 256MiB RAM gesehen, kommt eben immer auf den Fall an.


----------



## Oli (27. Aug 2008)

Eben. Ich hab auch erstmal geschluckt. Aber was will ich machen. Es stehen eben noch ein paar solcher Kisten hier rum und deswegen muss ich mich daran orientieren. Leider...

Grüße Oli


----------



## byte (27. Aug 2008)

Die Speicherdifferenz wird wohl schlicht und ergreifend durch die JVM kommen.

Wie ist das eigentlich bei .NET Anwendungen? Ist es wie bei Java, dass dort die VM quasi im Anwendungsprozess integriert ist? Oder läuft die VM dann separat als Systemprozess? Dann könnte man ja nicht den tatsächlichen Speicherverbrauch ableiten.


----------



## robertpic71 (27. Aug 2008)

Da ich vom anderen Thread ableite, dass es sich um den DB2/400 Treiber handelt hier noch mein Kommentar.

Wenn du die Programmgrößen vergleichst, ist dann im C(++) auch der ODBC-Treiber eingerechnet? Speziell den DB2/400 Treiber gibt es nicht extra - da muss man zumindest ein Konfigurationsprogramme vom Client Access mitinstallieren. Ich habe hier im Moment keine Minimalinstallation, aber die braucht sicher mehr als 4 MB.

Im Vergleich zu einer Windows ODBC Anwendung brauche ich beim Javaprogramm keine zusätzliche Installtion vom ODBC-Treiber. Ein nicht zu unterschätzender Vorteil. Vor allem den ODBC-Treiber von Cient Access wird man nicht so leicht mit einer eigenen Windowsanwendung mitverpacken können.

Was den Hauptspeicherbedarf angeht, könnte man noch versuchen diesen mit Startoptionen (z.B. -Xmx 16mb) zu minimieren. Da gibt es ein paar Schalter zur Speichersteuerung - aber außer den -Xmx habe ich da noch nie einen benötigt.

Zum JDBC von der DB2: Ja dieser Treiber hat vom ConnectionPool, vielen Codetabelle (EBCDIC, ASCII, ANSI, Unicode für viele Sprachen), FTP, Dateisystem, Druckerzugriff, Jobsteuerung usw. alles dabei. Den Treiber gibt es auch in einer OpenSource-Version (JTOPEN). Dort könnte man die build.xml bearbeiten. Da die Bereiche aber recht überschneident sind, gibt es nur wenige Packages und das Trennen ist mühsam (und für mich sowieso keine Thema).

Zu Dot.Net habe ich keine großen Erfahrungswerte, aber die wenigen Programme, hier in der Firma, sind auch weit weg vom Speicherverbrauch nativer Programme.

/Robert


----------



## Verjigorm (28. Aug 2008)

Ein Kumpel von mir hat mal auftragsweise für eine große deutsche Bank gearbeitet und dort vorort was installiert etc.

Dort läuft ein Rechner seit wohl 37!!! Jahren, der irgendwelche Sparbuchzinsen oder sonstwas berechnet. kA.
Es gibt noch 2 Mitarbeiter in der Firma, die halbwegs wissen, welche Knöpfe sie drücken müssen.
So wie es hiess, wird das Ding erst ersetzt, wenns wirklich abfackelt, vorher traut sich da keiner ran, diese "Kiste" zu ersetzen.
Wobei die Ablösemaschine wohl schon seit Jahren nebendran rumgammelt, sich aber keiner traut das DIng zu ersetzen, weil es wohl nicht ganz klar ist, was in der Downtime so alles passiert bzw. passieren wird.

(Alles nur HörenSagen, find ich aber witzig  )


----------

