Подтвердить что ты не робот

Java 8 резервирует минимум 1G для Metaspace, несмотря на (Max) MetaspaceSize

Java 8 резервирует 1G для Metaspace сразу после его запуска. Это означает, что минимальный размер метапроцесса равен 1G. Но я установил MetaspaceSize до 300 м и MaxMetaspaceSize до 400 м. Почему Java резервирует больше, чем я разрешаю?

Версия 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)

Флаги 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 

НМТ

[[email protected] 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) 

И сразу после начала было

Total: reserved=2402748KB, committed=150796KB     

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

Ответ 1

Причина, по которой Java резервирует 1G для классов, скрывает способ управления сжатыми указателями класса.

Длинный ответ: прочитайте этот документ https://docs.oracle.com/javase/8/docs/technotes/guides/vm/gctuning/considerations.html

Короткий ответ: установите правильный размер в свойстве "CompressedClassSpaceSize" -XX: CompressedClassSpaceSize = 300 м

Ответ 2

Класс (зарезервировано = 1221904 КБ

это не память, которая используется, просто виртуальное адресное пространство

= совершенное 197904KB

Это 197 МБ, а не 1 ГБ

Поэтому вы не показываете, что Java действительно потребляет 1 ГБ памяти для данных класса, только для того, чтобы он резервировал адресное пространство на 1 ГБ.