2016-05-03 7 views
-5

Ich bin total satt und angewidert, einen guten Wert für die Befehlszeilenoption -Xmx erraten zu müssen, meine Anwendungen mit OutOfMemoryException abstürzen zu lassen, den -Xmx Wert ändern und meine Anwendungen die ganze Zeit neu starten müssen.Anweisen, dass JVM Speicher wie normale Prozesse verwendet?

Gibt es eine Möglichkeit JVM normale handeln zu machen, so dass sie keine -Xmx Option erfordern würden, und würde und frei Speicher direkt von den OS wie jede normale Anwendung würde zuweisen? Gibt es einen GC, der effizienter ist und Speicher dynamisch an das Betriebssystem zurückgibt, wenn Objekte freigegeben werden?

Wenn ich mich richtig erinnere, hat Java seine Wurzeln in eingebetteten Umgebungen, aber ist seit langem in der Popularität gewachsen und verbreitet auf alle Arten von Systemen. Sicherlich muss es im 21. Jahrhundert einen Weg dafür geben? Es gibt viele Anwendungsfälle, bei denen eine Anwendung zwischen einigen Kilobyte und mehreren Terabyte Speicher benötigt, und die lästige -Xmx ist wirklich im Weg.

(Erinnerung an mich selbst: Da es iterativ keine gute Antworten in cargo cult Art und Weise einige andere GC-s und zufällige Befehlszeilenoptionen ausprobieren)

+1

Okay. Geben Sie kein '-Xmx' (** oder ** a' -Xms') -Argument an. –

+1

@ ElliottFrisch Aber hat die JVM nicht einen voreingestellten '-Xmx' Wert? – mceo

+1

@EliottFrisch Aber es gibt den Speicher zur Laufzeit nicht an das Betriebssystem zurück? – mceo

Antwort

2

Gibt es eine Möglichkeit JVM zu machen handeln normale so dass es keine -Xmx-Option benötigen würde und Speicher direkt vom Betriebssystem zuweisen und freigeben würde, so wie es jede normale Anwendung tun würde?

Das ist, was es standardmäßig tut. Sie müssen nur die maximale Größe des Heapspeichers festlegen, um anzugeben, an welcher Stelle ein Fehler auftreten soll, anstatt mehr Speicher zu verwenden.

Gibt es einen GC, der effizienter ist und aggressiv Speicher an das Betriebssystem zurückgibt, wenn Objekte freigegeben werden?

Ich glaube, die G1 Sammler in der Oracle JVM auf das besser ist (weil es neuer ist ??)

Wenn ich mich richtig erinnere, Java seine Wurzeln in Embedded-Umgebungen hat,

Ihr Stamm war in Java-Applets. J2ME wurde in eingebetteten Systemen verwendet und dies ist eine andere Version und Codebasis.

das lästige -Xmx ist wirklich im Weg.

Normalerweise setze ich es nicht selbst. Wenn Sie 128 GB oder mehr haben, werden standardmäßig 32 GB verwendet.

+1

Nein. Java hat seine Wurzeln in [Oak] (https://en.wikipedia.org/wiki/Oak_%28programming_language%29) und wurde ursprünglich für [Set-Top-Boxen] entwickelt (https: // en. wikipedia.org/wiki/Set-top_box). Bei der öffentlichen Veröffentlichung enthielten beliebte * Anwendungsfälle * Applets (aber ich machte eine AWT-Anwendung mit der öffentlichen Beta, die nichts mit Applets zu tun hatte). –

+0

@EliottFrisch und Eiche kommt aus C++ und Smalltalk .... –

+1

Fair genug, aber der Wikipedia-Eintrag enthält dieses Zitat * Ihr erster Versuch, am 3. September 1992 demonstriert, konzentrierte sich auf den Aufbau eines PDA-Geräts namens Star7 eine grafische Benutzeroberfläche und ein intelligenter Agent namens "Duke", um den Benutzer zu unterstützen. * Ein PDA im Jahr 1992 würde ein eingebettetes System (für mich) darstellen. –

0

Da es keine gute Antworten iterativ eine andere GCs ausprobieren und zufällige Kommandozeilenoptionen in Cargo-Kult Mode

Ein alternativer Ansatz ist zu lernen, wie die GCs Arbeit und was ihre Leistung Abwägungen sind und wie diese verschiedenen Parameter sie beeinflussen und dann auf der Basis dieser Informationen statt zufällig auswählen.

Dort ist extensive documentation zu diesem Thema.

Natürlich können Sie SO Antworten auch als Ausgangspunkt verwenden, um Optionen zu finden, die wahrscheinlich zu dem Ergebnis führen, das Sie wünschen, aber nichts hält Sie davon ab, dann auf zu untersuchen, warum diese Ergebnisse erzielen.

Keine Notwendigkeit, die Flugzeuge anzubeten.

Verwandte Themen