web-dev-qa-db-fra.com

Java 8 réserve minimum 1G pour Metaspace malgré (Max) MetaspaceSize

Java 8 réserve 1G pour Metaspace juste après son démarrage. Cela signifie que la taille minimale de la métaspace est de 1G. Mais j'ai configuré MetaspaceSize à 300 m et MaxMetaspaceSize à 400 m. Pourquoi Java réserve plus que ce que j'autorise?

Version Java

$ Java -version
Java version "1.8.0_45"
Java(TM) SE Runtime Environment (build 1.8.0_45-b14)
Java HotSpot(TM) 64-Bit Server VM (build 25.45-b02, mixed mode)

Drapeaux VM

$ jcmd 21689 VM.flags
21689:
-XX:CICompilerCount=3 -XX:ConcGCThreads=1 -XX:G1HeapRegionSize=1048576 -XX:InitialHeapSize=62914560 -XX:+ManagementServer -XX:MarkStackSize=4194304 -XX:MaxHeapSize=1006632960 -XX:MaxMetaspaceSize=399998976 -XX:MaxNewSize=603979776 -XX:MetaspaceSize=299999232 -XX:MinHeapDeltaBytes=1048576 -XX:NativeMemoryTracking=summary -XX:+UseCompressedClassPointers -XX:+UseCompressedOops -XX:+UseFastUnorderedTimeStamps -XX:+UseG1GC 

NMT

[jetty9-proxy@bm01 bin]$ jcmd 21689 VM.native_memory
21689:

Native Memory Tracking:

Total: reserved=2769543KB, committed=1311159KB

-                     Class (reserved=1221904KB, committed=197904KB)
                            (classes #36543)
                            (malloc=3344KB #44041) 
                            (mmap: reserved=1218560KB, committed=194560KB) 

Et juste après le début, c'était

Total: reserved=2402748KB, committed=150796KB     

-                     Class (reserved=1056956KB, committed=7868KB)
                            (classes #1300)
                            (malloc=188KB #564) 
                            (mmap: reserved=1056768KB, committed=7680KB) 
25
Eugene To

La raison pour laquelle Java réserve 1G pour les classes se cache dans la façon dont il gère les pointeurs de classe compressés.

La réponse longue: lisez ce document https://docs.Oracle.com/javase/ 8/docs/technotes/guides/vm/gctuning/considérations.html

La réponse courte: configurez la taille correcte dans la propriété 'CompressedClassSpaceSize' -XX: CompressedClassSpaceSize = 300m

26
Eugene To

Classe (réservé = 1221904KB

ce n'est pas de la mémoire qui est utilisée, juste de l'espace d'adressage virtuel

engagé = 197904 Ko

C'est 197 Mo, pas 1 Go

Par conséquent, vous ne montrez pas que Java consomme en fait 1 Go de mémoire pour les données de classe, mais seulement qu'il réserve 1 Go d'espace d'adressage.

4
the8472