Erhöhen der maximalen Heap-Größe der JVM für speicherintensive Anwendungen


88

Ich muss eine speicherintensive Java-Anwendung ausführen, die mehr als 2 GB verwendet, habe jedoch Probleme, die maximale Größe des Heapspeichers zu erhöhen. Bisher habe ich folgende Ansätze ausprobiert:

  • Einstellen des Parameters -Xmx, z. B. -Xmx3000m. Dieser Ansatz schlägt bei der Erstellung der JVM fehl. Nach dem, was ich gegoogelt habe, sieht es so aus, als müsste -Xmx weniger als 2 GB betragen.

  • Verwenden der Option -XX: + AggressiveHeap . Wenn ich diesen Ansatz versuche, wird der Fehler "Nicht genügend Speicher" angezeigt, der besagt, dass die Heap-Größe 1273,4 MB beträgt, obwohl mein Computer über 8 GB Speicher verfügt.

Gibt es einen anderen Ansatz, mit dem ich versuchen kann, die maximale Heap-Größe der JVM zu erhöhen? Hier ist eine Zusammenfassung der Computerspezifikationen:

  • Betriebssystem: Windows 7 (64 Bit)
  • Prozessor: Intel Core i7 (2,66 GHz)
  • Speicher: 8 GB
  • Java-Version:
java version "1.6.0_18"
Java(TM) SE Runtime Environment (build 1.6.0_18-b07)
Java HotSpot(TM) Client VM (build 16.0-b13, mixed mode, sharing)

7
Übrigens: Die minimale und maximale Speichergröße sind jetzt Standardoptionen. Sie können -ms und -mx anstelle von -Xms und -Xmx verwenden. -X ?? ist für nicht standardmäßige Optionen reserviert.
Peter Lawrey

2
Standard für welche JVM? Sie sind immer noch nicht Standard für die HotSpot JVM (ab 1.8). Siehe docs.oracle.com/javase/8/docs/technotes/tools/unix/…
Huckle

-mx und -ms existieren und funktionieren, aber ich kann sie nicht in der offiziellen Java-Dokumentation finden. @PeterLawrey> Können Sie einen Link zur Dokumentation hinzufügen? Danke
Michal Bernhard

2
@MichalBernhard es ist Abwärtskompatibilität mit Java 1.1. Ich habe gesehen, dass es für diese Version dokumentiert ist, aber jetzt ist es möglicherweise schwer zu finden. ;)
Peter Lawrey

1
Danke @PeterLawrey für eine Erklärung. Aber wenn Sie sagen, dass es jetzt Standard ist, meinen Sie damit, dass es Standard aus Java 1.1 ist (aber in späteren Versionen nicht dokumentiert)? Scheint seltsam :) Übrigens habe ich einen Link zur Java 1.1-Dokumentation gefunden und Sie haben Recht: ad.ntust.edu.tw/course/ad5601701/jmdl/docs/java/tooldocs/win32/…
Michal Bernhard

Antworten:



96

Wenn Sie JVM im 32-Bit-Modus verwenden, kann maximal 1280 MB Heap-Größe zugewiesen werden. Wenn Sie darüber hinausgehen möchten, müssen Sie JVM im 64-Modus aufrufen.

Sie können Folgendes verwenden:

$ java -d64 -Xms512m -Xmx4g HelloWorld

wo,

  • -d64: Aktiviert die 64-Bit-JVM
  • -Xms512m: Legt die anfängliche Heap-Größe auf 512 MB fest
  • -Xmx4g: Legt die maximale Heap-Größe auf 4 GB fest

Sie können -Xms und -Xmx gemäß Ihren Anforderungen einstellen (YMMV).

Eine sehr gute Ressource zur Optimierung der JVM-Leistung, die Sie sich ansehen sollten: http://java.sun.com/javase/technologies/hotspot/gc/gc_tuning_6.html


Meine JVM ist 32-Bit und erlaubt maximal -Xmx1024M. Ich werde auch die 64-Bit-Version ausprobieren.
Kiltek

Ich habe JVM 64-Bit ausprobiert und es hat perfekt funktioniert. Ich kann jetzt 4096 MB maximale Heap-Größe einstellen. Wenn Sie sowohl 32- als auch 64-Bit installiert haben, müssen Sie zumindest unter Windows den Java-Pfad für Ihre Anwendungen auf die neu installierte 64-Bit-Version verweisen. Andernfalls bleibt der Fehler bestehen. Unter Windows kann dies häufig durch Ändern des Java-Pfads in den Umgebungsvariablen des Systems erfolgen.
Fabiano

Ich denke, die Grenze für den maximalen Heap liegt nicht bei 1280, sondern bei 1700 MB. Ich habe bei meiner 32-Bit-JVM-Installation maximal 1600 MB Heap verwendet und es hat einwandfrei funktioniert.
Fabiano

Was ist das HelloWorld-Argument in Ihrem Befehl? Wie kann ich diesen Befehl verwenden, wenn ich das Maximum eines Java-Prozesses festlegen möchte, der mit dem Befehl java -jar myApp.jar unter Linux gestartet wird?
LordScone

Hallo, darf ich fragen, wie groß die maximale Java-Heap-Größe sein kann? Wenn ich die Anwendung ausführe, beträgt die Standardeinstellung -Xmx auf meinem Computer 4 GB. Kann ich sie jedoch auf mehr als 4 GB einstellen?
Ock

14

Ich glaube, das 2-GB-Limit gilt für 32-Bit-Java. Ich dachte, v1.6 wäre immer 64-Bit, aber versuchen Sie, den 64-Bit-Modus zu erzwingen, nur um zu sehen: Fügen Sie die Option -d64 hinzu.


Die Option -D64 hat nicht funktioniert. Ich werde versuchen, die 64-Bit-JVM zu verwenden, wie von GregS vorgeschlagen, und die Ergebnisse melden.
Alceu Costa

1
Die Schalter -d64 und -d32 funktionieren nur unter Solaris ordnungsgemäß (zumindest gemäß dieser Dokumentation): java.sun.com/docs/hotspot/HotSpotFAQ.html#64bit_layering .
Lukasz Stelmach

Ich habe es mit beiden Optionen versucht. Mit -d64 kann die JVM nicht gestartet werden, auch wenn ich die Xmx-Option nicht angegeben habe. Der -D64 funktioniert nur, wenn ich den Xmx nicht spezifiziere.
Alceu Costa

@Lukasz -d64 und -d32 scheinen auch auf Apples JVM zu funktionieren. Dieses Dokument scheint jedoch zu implizieren, dass sie für Windows- und Linux-JVMs von Sun nicht funktionsfähig sind.
G__

8

32-Bit-Java ist auf ungefähr 1,4 bis 1,6 GB beschränkt.

Häufig gestellte Fragen zu Oracle 32-Bit-Heaps

Zitat

Die maximale theoretische Heap-Grenze für die 32-Bit-JVM beträgt 4G. Aufgrund verschiedener zusätzlicher Einschränkungen wie verfügbarem Swap, Verwendung des Kernel-Adressraums, Speicherfragmentierung und VM-Overhead kann das Limit in der Praxis viel niedriger sein. Auf den meisten modernen 32-Bit-Windows-Systemen liegt die maximale Heap-Größe zwischen 1,4 G und 1,6 G. Auf 32-Bit-Solaris-Kerneln ist der Adressraum auf 2G beschränkt. Unter 64-Bit-Betriebssystemen, auf denen die 32-Bit-VM ausgeführt wird, kann die maximale Heap-Größe höher sein und sich auf vielen Solaris-Systemen 4G nähern.


4

Unten funktioniert conf für mich:

JAVA_HOME=/JDK1.7.51-64/jdk1.7.0_51/
PATH=/JDK1.7.51-64/jdk1.7.0_51/bin:$PATH
export PATH
export JAVA_HOME

JVM_ARGS="-d64 -Xms1024m -Xmx15360m -server"

/JDK1.7.51-64/jdk1.7.0_51/bin/java $JVM_ARGS -jar `dirname $0`/ApacheJMeter.jar "$@"
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.