Java 8 rezerwuje minimum 1G dla Metaspace pomimo (Max) MetaspaceSize

Java 8 rezerwuje 1G dla Metaspace zaraz po uruchomieniu. Oznacza to, że minimalny rozmiar metaspace to 1G. ale ja ustawiłem MetaspaceSize na 300m i MaxMetaspaceSize na 400m. dlaczego Java rezerwuje więcej niż pozwalam?

Wersja 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)

Flagi 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) 

I zaraz po starcie było

Total: reserved=2402748KB, committed=150796KB     

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

2 answers

Powód, dla którego Java rezerwuje 1G dla klas, ukrywa się w sposób, w jaki zarządza skompresowanymi wskaźnikami klas.

długa odpowiedź: przeczytaj ten dokument https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/considerations.html

krótka odpowiedź: Ustaw prawidłowy rozmiar we właściwości 'CompressedClassSpaceSize' - XX: CompressedClassSpaceSize = 300m

 23
Author: Eugene To,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-29 06:30:36

Class (reserved=1221904kb

To nie jest pamięć, która jest używana, tylko wirtualna przestrzeń adresowa

Committed=197904kb

To 197mb, nie 1GB

Dlatego nie pokazujesz, że java faktycznie zużywa 1GB pamięci na dane klasowe, tylko że rezerwuje 1GB przestrzeni adresowej.

 4
Author: the8472,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-26 15:01:57