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)
Alceu Costa
quelle
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:

47

Holen Sie sich eine 64-Bit-JVM von Oracle .

Präsident James K. Polk
quelle
1
Hat bei mir funktioniert :-) Die Anwendung mit -Xmx4g ausführen und bisher keine Probleme.
Alceu Costa
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

Mohitsoni
quelle
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.

G__
quelle
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.

Jean B.
quelle
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 "$@"
TutorialbyBeispiel
quelle