私の理解によると、ネイティブ ヒープは、Java プロセスに最大ヒープ サイズを割り当てた後に残ったメモリです。
32 ビット Java プロセスの場合、このプロセスに割り当てることができる最大仮想メモリは 4GB です。この合計 4GB のうち、最大ヒープに 2GB を設定し、OS によって 1GB が使用されているとします。では、残りの 1GB のメモリをネイティブ ヒープと呼べるでしょうか。
同様に、64 ビット Java プロセスの場合、プロセスに割り当てることができる最大メモリは 4GB を超える可能性があります。たとえば、システムに 16 GB の RAM があるとします。仮想アドレス空間の範囲では 16 GB を超えるメモリが許可されないため、システムの各プロセスに割り当てることができる最大仮想メモリは 16 GB になります。それは正しいですか?
つまり、64 ビット Java プロセスのネイティブ ヒープは (16- 2(-Xmx) -1(OS))、つまり 15GB になりますか?
ネイティブ ヒープの計算に関する私の理解は正しいですか?
私の理解が正しければ、ネイティブ メモリから割り当てられるメタスペースの最大使用可能メモリが合計使用可能システム メモリであると言う理由です。各プロセスが取得する最大仮想メモリは、システムで可能な最大仮想アドレス可能範囲であり、このメモリの一部のうち、ヒープと OS によって占有されます。
プロセスに割り当てられた合計メモリをヒープ メモリとして設定した場合、このプロセスで使用できるネイティブ ヒープがないため、outOfMemoryError:Metaspaceはスローされませんか?
私の理解を正すのを手伝ってください。ありがとう。