Java Heap Space erhoehen

Hallo

Ich habe für mein Programm zu wenig heap space, konkret hab ich für eine Funktion in meinem Programm zuwenig Heap space.
In dieser Funktion hole ich eine wirklich riesige Datenmenge von meiner Db und da ich dieses laden einfach extrem lange dauert behalte ich alle Daten dann im Speicher, da ich diese mehrfach brauche.

Jetzt weis ich natürlich, dass ich mit den Parametern -Xmx und -Xms den Heapspace beeinflussen kann.
Meine Frage nun gibt es einen Nachteil, wenn ich den Heap Space nun bei mir erhöhe?

Ich finde bei Google zu diesem Thema nichts.

LG

Hallo AmunRa,

bei der Menge an Speicher, die heutzutage in die Rechner verbaut werden, brauchst du dir da normalerweise keine Gedanken machen, wenn du deinem Programm etwas Speicher extra gibst.

Was für Nachteile befürchtest du den?

MfG
hansmueller

Konkret habe wir leider bei unserer Software an manchen Stellen ein ziemliches Performance Problem.
Liegt wohl daran, ein Krebsgeschwühr 15 Jahre zu pflegen ist halt nicht leicht.

Jetzt ist die Frage ob ein erhoehter Speicher die Performance noch verschlechtern koennte, oder auch ob jemand Auswirkungen kennt, die mir nicht einfallen.
Ich persönlich habe auch keine Bedenken, aber ich muss das halt alles meinem Chef nachher begruenden. Und da will ich einfach passende Argumente haben.

Vielen Dank fuer deine Einschaetzung

Solange nur du deine Anwendung benutzt (bzw ihr in eurer Firma) ist es egal, Nachteile hat man dadurch eher nicht. Erst wenn du sie publizierst, musst du die Anwender darauf aufmerksam machen, dass die JVM mit den Parametern -Xms usw gestartet werden muss.
Meistens lässt sich durch die Notwendigkeit solcher Parameter aber eher auf Designfehler schliessen. Evtl. kann man die Speichernutzung durch konkretere (optimierte) DB-Abfragen und/oder Datenhaltung in DirectBuffern (Java-NIO; belegen keinen Java-Heap) optimieren.

Hallo AmunRa,

wir haben bei uns auch so eine … gewachsene Software.
Da hatten wir letztens auch diverse Probleme. Bei unserer Software werden auch große Datenmengen zwischen der Datenbank und unserem Programm hin- und hergeschaufelt. Die Probleme wurden durch eine Erhöhung des zugewiesenen Speichers beseitigt.

Läuft euer Programm auf einer VM? Das kann sich besonders bei Datenbanken negativ auswirken. Aus irgendeinem Grund laufen Datenbanken in VMs grottenlangsam. Da sollte man sich schon mal überlegen, einen echten Hardware-Server für diese Aufgabe hinzustellen.

MfG
hansmueller

Das ist kein Problem, da wir einen eigenen Startmechanismus verwenden so das der Kunde nur auf einen Link klicken muss.

[QUOTE=Spacerat;69177]
Meistens lässt sich durch die Notwendigkeit solcher Parameter aber eher auf Designfehler schliessen.[/QUOTE]
Das bezweifle ich nicht. Die Software wird nun seit ueber 15 Jahren entwickelt und hat leider einige Designfehler. Leider ist das ganze zu Komplex als dass mir jemand erlauben wuerde kritische Stellen ganz neu zu schreiben. Arbeite nun noch nicht mal ein halbes Jahr dort.

DirectBuffer ist aber vl ein gutes Stichwort zu Googeln.

Danke

… Direct Buffer werden nicht vom Garbage Collector verwaltet, genaugenommen werden diese gar nicht von der VM verwaltet, lass da die Finger von (ausser du machst OpenGL oder etwas sehr HW nahes).

Wir koennen nicht wissen was mit deiner App pasiert wenn du ihr mehr Heap gibst, das kannst du aber leicht rausfinden.

Ich habe für mein Programm zu wenig heap space, konkret hab ich für eine Funktion in meinem Programm zuwenig Heap space.
In dieser Funktion hole ich eine wirklich riesige Datenmenge von meiner Db und da ich dieses laden einfach extrem lange dauert behalte ich alle Daten dann im Speicher, da ich diese mehrfach brauche.

Kann man das denn aendern/anpassen/refakturieren?

So ich noch einmal eine Frage,
habe den Code noch an ein paar stellen optimiert (d.h Laufzeit hat siche um 30% bis 50 % verbessert und Speicherverbrauch (gemessen mit VisualVM um 20% bis 25%)

habe aber dennoch empfohlen, den Max Heap von 786m auf 1500m zu erhöhen. Hab aber gelesen, dass Windows hier einige Probleme mit 32 Bit VMs macht.

Hab es nun auch bei mir getestet und mein Rechner hat eigentlich 16 GB Ram. wenn ich aber mein Java 1.7.25 starte mit diesem aufruf java -Xmx1500m
bekomme ich einen Fehler

Error occurred during initialization of VM
Could not reserve enough space for object heap
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit. 

Wie groß kann ich denn den Heap nun machen?
seltsamer wiese mit java 1.6.45 funktioniert der aufruf von java -Xmx1500m

Danke für eure Hilfe

Das ist ein bißchen unterschiedlich, und hängt z.B. auch damit zusammen, welche DLLs geladen werden und wie groß der PermGen ist. 1500 ist schon ziemlich viel für die 32bittige VM, ich kam selten über 1300m hinaus. Mit 1200 sollte man auf der sicheren Seite sein

[QUOTE=maki]… Direct Buffer werden nicht vom Garbage Collector verwaltet, genaugenommen werden diese gar nicht von der VM verwaltet[/QUOTE]Das genau ist ja der Trick… DirectBuffer benötigen nur das an Heap, was für die Referenzen in Java nötig ist. Vom GC wird auch nur dieser Teil der Buffer verwaltet (ca 64 Byte pro Buffer). Aber wie es aussieht, werden solche Massnahmen ohnehin nicht benötigt.

1500m sollten aber eigentlich kein Problem sein für die JVM. Bei stackoverflow allokiert einer 1600m und hat innerhalb der VM dann trotzdem nur 1577m zur Verfügung.

Evtl. hat sich das Verhalten dieser Option in Version 7 ja dahingehend geändert, dass nun der maximal belegbare Speicher nicht mehr überschritten werden darf.