Javaヒープ割り当てが2MBの倍数であることに気付きました。たとえば、-Xmx values as 1021m, 1022m
というJVMを開始し、両方のJVMがヒープサイズ1022m
で開始されました。同様にヒープサイズ1023m,1024m
は1024m
で始まります。Javaヒープ割り当てが2MBの倍数である
出力は、以下である:両方の場合において
C:\Users\myuser>java -Xmx1021m -XX:+PrintFlagsFinal -version | findstr "MaxHeapSize"
uintx MaxHeapSize := 1071644672
{product}
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) Client VM (build 25.121-b13, mixed mode)
C:\Users\myuser>java -Xmx1022m -XX:+PrintFlagsFinal -version | findstr "MaxHeapSize"
uintx MaxHeapSize := 1071644672
{product}
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) Client VM (build 25.121-b13, mixed mode)
それは1022メガバイトである1071644672のバイトとしてMaxHeapSizeを示しています。両方の場合において
C:\Users\myuser>java -Xmx1023m -XX:+PrintFlagsFinal -version | findstr "MaxHeapSize"
uintx MaxHeapSize := 1073741824
{product}
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) Client VM (build 25.121-b13, mixed mode)
C:\Users\myuser>java -Xmx1024m -XX:+PrintFlagsFinal -version | findstr "MaxHeapSize"
uintx MaxHeapSize := 1073741824
{product}
java version "1.8.0_121"
Java(TM) SE Runtime Environment (build 1.8.0_121-b13)
Java HotSpot(TM) Client VM (build 25.121-b13, mixed mode)
それは1024メガバイトである1073741824のバイトとしてMaxHeapSizeを示しています。
この動作はXmsに似ています。
質問1:ヒープサイズが指定された値から2の倍数に変更されるのはなぜですか?
質問2:フラグかのヒープを作成するために、JVMを強制的にいくつかの方法があります:JVMが実際に
質問3を指定したものとは異なる値で開始されたとき、なぜJavaがさえ私たちに警告しません。 1021mb?
質問4:仮想マシンで1023MBの空きメモリがあり、1023MBのヒープを持つJVMを作成しようとしています。上記の動作によって、実際には利用できない1024MBで開始しようとします。 JVMの作成に失敗しますか?
これはJVMではなくオペレーティングシステムの制限だと思います。オペレーティングシステムには通常、「メモリページ」という概念があります。これは処理に割り当てられる物理メモリの量が最小限です。各プロセスは多数のページを持つことができますが、1ページ以上はありません。お使いのOSのページサイズは2MBです。 –
@ M.Prokhorovあなたのコメントはほぼ正しいです、唯一の修正は最小量の*仮想*メモリです。メモリページをより単純にする - 仮想、メモリフレーム - 物理。 – Eugene
@Eugene WindowsとLinuxのプロセスで、最小限の仮想メモリを取得する方法を教えてください。 –