Finden Sie Ihre Java-Heapspeichergröße heraus

Finden Sie die Größe Ihres Java-Heapspeichers heraus

java-heap-size

In diesem Artikel zeigen wir Ihnen, wie Sie die-XX:+PrintFlagsFinal verwenden, um die Details Ihrer Heap-Größe herauszufinden. In Java werden die Standard- und die maximale Heap-Größe basierend auf diesen -ergonomics algorithm zugewiesen.

Heap-Größen
Anfängliche Heap-Größe von 1/64 des physischen Speichers bis zu 1 GByte
Maximale Heap-Größe von 1/4 des physischen Speichers bis zu 1 GByte

Die oben genannten Algorithmen dienen jedoch nur als Referenz und können in verschiedenen VMs variieren.

1. Java-Speicherübersicht

Ein kurzer Überblick über die Java-Speicherstruktur:

1. Java Heap Size
Speicherort für Objekte, die von Ihrer Java-Anwendung erstellt wurden. Hier findet die Garbage Collection statt, der von Ihrer Java-Anwendung verwendete Speicher. Bei einem schweren Java-Prozess führt eine unzureichende Heap-Größe zu den beliebtenjava.lang.OutOfMemoryError: Java heap space.

-Xms - Set initial Java heap size
-Xmx - Set maximum Java heap size

$ java -Xms512m -Xmx1024m JavaApp

2. Perm Gen Size
Ort zum Speichern Ihrer geladenen Klassendefinition und Metadaten. Wenn ein großes Code-Basis-Projekt geladen wird, verursacht die unzureichende Perm-Gen-Größe die beliebtenJava.Lang.OutOfMemoryError: PermGen.

-XX:PermSize - Set initial PermGen Size.
-XX:MaxPermSize - Set the maximum PermGen Size.

$ java -XX:PermSize=64m -XX:MaxPermSize=128m JavaApp

3. Java Stack Size
Größe eines Java-Threads. Wenn in einem Projekt viele Threads verarbeitet werden, reduzieren Sie diese Stapelgröße, um zu vermeiden, dass nicht genügend Arbeitsspeicher zur Verfügung steht.
-Xss = Java-Thread-Stapelgröße festlegen

$ java -Xss512k JavaApp

Note
Der Standardwert für Heap-Größe, Perm-Gen oder Stack-Größe unterscheidet sich von verschiedenen JVMs. Die beste Vorgehensweise besteht darin, immer Ihren eigenen Wert zu definieren.

2. Ubuntu

Dies ist die Testumgebung:

OS  : Ubuntu 13 (64 bits) (Under VirtualBox)
RAM : 4G
CPU : 1 x Processors
JDK : 1.7.0_51
$ java -XX:+PrintFlagsFinal -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

    uintx InitialHeapSize                          := 64781184        {product}
    uintx MaxHeapSize                              := 1038090240      {product}
    uintx PermSize                                  = 21757952        {pd product}
    uintx MaxPermSize                               = 174063616       {pd product}
     intx ThreadStackSize                           = 1024            {pd product}
java version "1.7.0_51"
OpenJDK Runtime Environment (IcedTea 2.4.4) (7u51-2.4.4-0ubuntu0.13.10.1)
OpenJDK 64-Bit Server VM (build 24.45-b08, mixed mode)

In der obigen Umgebung hat JVM die folgenden Standardwerte zugewiesen:

  1. Java heap size
    InitialHeapSize = 64781184 Byte (61,7 MB) und MaxHeapSize = 1038090240 Byte (990 MB).

  2. PermGen Size
    PermSize = 21757952 Bytes (20,75 MB), MaxPermSize = 174063616 Bytes (166 MB)

  3. Thread Stack Size
    ThreadStackSize = 1024 Kilobyte (1 MB)

Die zugewiesene Größe des Heapspeichers liegt ziemlich nahe am Ergonomieergebnis.

#ergonomics algorithm
Initial heap size = 4096M/64 = 64M
Maximum heap size = 4096M/4 = 1024M

3. Mac OS X

Dies ist die Testumgebung:

OS  : Mac OSX 10.9
RAM : 8G
CPU : 4 x Processors
JDK : 1.7.0_05
$ java -XX:+PrintFlagsFinal -version | grep -iE 'heapsize|permsize|threadstacksize'

    uintx InitialHeapSize                          := 20655360        {product}
    uintx MaxHeapSize                              := 331350016       {product}
    uintx PermSize                                  = 21757952        {pd product}
    uintx MaxPermSize                               = 85983232        {pd product}
     intx ThreadStackSize                           = 1024            {pd product}
java version "1.7.0_05"
Java(TM) SE Runtime Environment (build 1.7.0_05-b05)
Java HotSpot(TM) 64-Bit Server VM (build 23.1-b03, mixed mode)
  1. Java heap size
    InitialHeapSize = 20655360 Byte (19,69 MB) und MaxHeapSize = 331350016 Byte (316 MB).

  2. PermGen Size
    PermSize = 21757952 Bytes (20,75 MB), MaxPermSize = 85983232 Bytes (82 MB).

  3. Java Stack Size
    ThreadStackSize = 1024 Kilobyte (1 MB)

Die zugewiesene Größe des Heapspeichers ist im Vergleich zum folgenden Ergonomieergebnis völlig irrelevant.

#ergonomics algorithm
Initial heap size = 8192M/64 = 128M
Maximum heap size = 8192M/4 = 2048M

4. Windows

In Windows gibt es keinegrep, stattdessen verwenden wirfindstr.

Dies ist die Testumgebung:

OS  : Windows 8
RAM : 16G
CPU : 8 x Processors
JDK : 1.7.0_40
C:\>java -XX:+PrintFlagsFinal -version | findstr /i "HeapSize PermSize ThreadStackSize"

    uintx InitialHeapSize                          := 266634176       {product}
    uintx MaxHeapSize                              := 4267704320      {product}
    uintx PermSize                                  = 21757952        {pd product}
    uintx MaxPermSize                               = 85983232        {pd product}
     intx ThreadStackSize                           = 0               {pd product}
java version "1.7.0_40"
Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
Java HotSpot(TM) 64-Bit Server VM (build 24.0-b56, mixed mode)
  1. Java heap size
    InitialHeapSize = 266634176 Byte (256 MB) und MaxHeapSize = 4266146816 Byte (4068 MB).

  2. PermGen Size
    PermSize = 21757952 Bytes (20,75 MB), MaxPermSize = 85983232 Bytes (823). M).

  3. Java Stack Size
    ThreadStackSize = 0 Kilobyte. (seltsam…)

Die zugewiesene Größe des Heapspeichers entspricht nahezu dem Ergebnis der Ergonomie:

#ergonomics algorithm
Initial heap size = 16384/64 = 256M
Maximum heap size = 16384/4 = 4096M

5. Vorgeschlagener Java-Speicher

Unten ist mein empfohlener Wert für eine kleine bis mittlere Java-Anwendung :)

  1. Heap = -Xms512m -Xmx1024m

  2. PermGen = -XX: PermSize = 64 m -XX: MaxPermSize = 128 m

  3. Thread = -Xss512k

P.S For most Java projects, 512k for a thread is sufficient.

$ java -XX:+PrintFlagsFinal -Xms512m -Xmx1024m -Xss512k -XX:PermSize=64m -XX:MaxPermSize=128m
    -version | grep -iE 'HeapSize|PermSize|ThreadStackSize'

    uintx InitialHeapSize                          := 536870912       {product}
    uintx MaxHeapSize                              := 1073741824      {product}
    uintx PermSize                                 := 67108864        {pd product}
    uintx MaxPermSize                              := 134217728       {pd product}
     intx ThreadStackSize                          := 512             {pd product}

6. FAQs

Q. What is -version?
A. Vermeiden Sie die Beschwerden des Java-Compilers und ersetzen Sie die "-Version" durch Ihren Java-Anwendungsnamen.

$ java -XX:+PrintFlagsFinal {your-java-program} | grep HeapSize

Q. What is -XX:+PrintCommandLineFlags?
A. Dieses-XX:+PrintCommandLineFlags wird verwendet, um die Werte auszudrucken, die nur von VM geändert wurden (angezeigt durch dieses:=-Symbol).

7. Fazit

Schließlich unterscheiden sich die Standardwerte für Heapspeicher, Perm-Gem und Stapelgröße von den einzelnen JVMs. Erwarten Sie nicht, dass JVM die optimalen Werte für Ihre Java-Anwendung zuweist. Am besten ermitteln Sie Ihre Speicherdetails und passen die Werte entsprechend an.

Nur einige herausfinden und teilen, lassen Sie mich Ihren Kommentar wissen.