Java 8は、起動直後にメタスペース用に1Gを予約します。つまり、メタスペースの最小サイズは1Gです。しかし、MetaspaceSizeを300mに、MaxMetaspaceSizeを400mに設定しました。なぜ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
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)
そして、開始直後は
Total: reserved=2402748KB, committed=150796KB
- Class (reserved=1056956KB, committed=7868KB)
(classes #1300)
(malloc=188KB #564)
(mmap: reserved=1056768KB, committed=7680KB)
Javaがクラス用に1Gを予約する理由は、圧縮されたクラスポインターを管理する方法に隠れています。
長い回答:このドキュメントを読む https://docs.Oracle.com /javase/8/docs/technotes/guides/vm/gctuning/considerations.html
短い答え:「CompressedClassSpaceSize」プロパティで正しいサイズを設定する-XX:CompressedClassSpaceSize = 300m
クラス(予約= 1221904キロバイト
これは、単に仮想アドレス空間の使われているメモリではありません
コミット= 197904キロバイト
それは197メガバイト、1ギガバイトではないのです
したがって、Javaは実際にクラスデータ用に1GBのメモリを消費しますが、1GBのアドレススペースを予約することのみを示しています。