Découvrez la taille de votre mémoire Java

Découvrez la taille de la mémoire de votre tas Java

java-heap-size

Dans cet article, nous allons vous montrer comment utiliser les-XX:+PrintFlagsFinal pour connaître le détail de la taille de votre tas. En Java, la taille de tas par défaut et maximale est allouée en fonction de ces -ergonomics algorithm.

Tailles de segment
Taille de segment initiale de 1/64 de mémoire physique jusqu'à 1 Go
Taille de segment maximale de 1/4 de mémoire physique jusqu'à 1 Go

Cependant, les algorithmes ci-dessus ne sont que pour référence, ils peuvent varier selon les VM.

1. Présentation de la mémoire Java

Un aperçu rapide de la structure de la mémoire Java:

1. Java Heap Size
Lieu de stockage des objets créés par votre application Java, c'est là que se déroule le nettoyage de la mémoire, la mémoire utilisée par votre application Java. Pour un processus Java lourd, une taille de tas insuffisante provoquera lesjava.lang.OutOfMemoryError: Java heap space populaires.

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

$ java -Xms512m -Xmx1024m JavaApp

2. Perm Gen Size
Emplacement pour stocker la définition de classe et les métadonnées chargées. Si un projet de base de code volumineux est chargé, la taille insuffisante de Perm Gen provoquera lesJava.Lang.OutOfMemoryError: PermGen populaires.

-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
Taille d'un thread Java. Si un projet a beaucoup de threads de traitement, essayez de réduire cette taille de pile pour éviter de manquer de mémoire.
-Xss = définir la taille de la pile de threads java

$ java -Xss512k JavaApp

Note
La valeur par défaut de la taille du tas, de la génération perm ou de la taille de la pile est différente de celle des JVM. La meilleure pratique consiste toujours à définir votre propre valeur.

2. Ubuntu

Voici l'environnement de test:

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)

Dans l'environnement ci-dessus, JVM a alloué les valeurs par défaut suivantes:

  1. Java heap size
    InitialHeapSize = 64781184 octets (61,7 Mo) et MaxHeapSize = 1038090240 octets (990 Mo).

  2. PermGen Size
    PermSize = 21757952 octets (20,75 Mo), MaxPermSize = 174063616 octets (166 Mo)

  3. Thread Stack Size
    ThreadStackSize = 1024 kilo-octets (1 Mo)

La taille de mémoire allouée au tas est assez proche du résultat ergonomique.

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

3. Mac OS X

Voici l'environnement de test:

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 octets (19,69 Mo) et MaxHeapSize = 331350016 octets (316 Mo).

  2. PermGen Size
    PermSize = 21757952 octets (20,75 Mo), MaxPermSize = 85983232 octets (82 Mo).

  3. Java Stack Size
    ThreadStackSize = 1024 kilo-octets (1 Mo)

La taille de la mémoire de tas allouée est totalement sans importance si on la compare au résultat ergonomique suivant.

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

4. les fenêtres

Il n'y a pas degrep dans Windows, à la place, nous utilisonsfindstr.

Voici l'environnement de test:

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 octets (256 Mo) et MaxHeapSize = 4266146816 octets (4068 Mo).

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

  3. Java Stack Size
    ThreadStackSize = 0 kilo-octets. (bizarre…)

La taille de mémoire allouée du tas est presque la même avec le résultat ergonomique:

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

5. Mémoire Java suggérée

Voici ma valeur suggérée pour une application Java petite à moyenne :)

  1. Tas = -Xms512m -Xmx1024m

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

  3. Filetage = -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. Évitez les plaintes du compilateur Java, remplacez «-version» par le nom de votre application Java.

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

Q. What is -XX:+PrintCommandLineFlags?
A. Ce-XX:+PrintCommandLineFlags est utilisé pour imprimer les valeurs modifiées par VM uniquement (indiquées par ce symbole:=).

7. Conclusion

Enfin, les valeurs par défaut de la mémoire du tas, de la gemme perm et de la taille de la pile sont différentes de chaque JVM, ne vous attendez pas à ce que JVM attribue les valeurs optimales pour votre application Java. La meilleure pratique consiste à découvrir les détails de votre mémoire, puis à affiner les valeurs en conséquence.

Juste quelques découvertes et partage, faites-moi savoir votre commentaire.