10

私の JVM ヒープの最大値は、私の Hadoop クラスターの 1 つの名前ノードで 8GB に構成されています。JMX を使用してその JVM を監視すると、添付の画像に示すように、報告された最大値が常に変動しています。

http://highlycaffeinated.com/assets/images/heapmax.png

Hadoop クラスターの 1 つ (最もアクティブなクラスター) でのみ、この動作が見られます。他のクラスタでは、報告された最大値は構成された値に固定されたままです。報告された最大値が変更される理由はありますか?

アップデート:

Javaのバージョンは「1.6.0_20」

ヒープの最大値は、次の行で hadoop-env.sh に設定されます。

export HADOOP_NAMENODE_OPTS="-Xmx8G -Dcom.sun.management.jmxremote.port=8004 $JMX_SHARED_PROPS"

psショー:

hadoop 27605 1 99 Jul30 ? 11-07:23:13 /usr/lib/jvm/jre/bin/java -Xmx1000m -Xmx8G

更新 2:

-Xms8G昨夜、スタートアップ コマンド ラインにスイッチを追加しました。

export HADOOP_NAMENODE_OPTS="-Xms8G -Xmx8G -Dcom.sun.management.jmxremote.port=8004 $JMX_SHARED_PROPS"

下の画像に示すように、パターンは変わったように見えますが、最大値は依然として変動しています。

http://highlycaffeinated.com/assets/images/heapmax2.png

更新 3:

これは、一定のままである非ヒープの最大値も示す新しいグラフです。

http://highlycaffeinated.com/assets/images/heapmax3.png

4

2 に答える 2

1

MemoryMXBeanのドキュメントによると、メモリ使用量は「ヒープ」メモリと「非ヒープ」メモリの 2 つのカテゴリで報告されます。非ヒープ カテゴリの説明には次のように書かれています。

Java 仮想マシンは、ヒープ以外のメモリ (非ヒープ メモリと呼ばれます) を管理します。Java 仮想マシンには、すべてのスレッドで共有されるメソッド領域があります。メソッド領域は非ヒープ メモリに属します。ランタイム定数プール、フィールドとメソッドのデータ、メソッドとコンストラクターのコードなど、クラスごとの構造を格納します。Java 仮想マシンの起動時に作成されます。

メソッド領域は論理的にはヒープの一部ですが、Java 仮想マシンの実装では、ガベージ コレクションや圧縮を行わないことを選択する場合があります。ヒープと同様に、メソッド領域は固定サイズの場合もあれば、拡大縮小する場合もあります。メソッド領域のメモリは連続している必要はありません。

-Xmxこの説明は、実際にはヒープの一部であり、フラグを使用して割り当てられたメモリに対してカウントされるパーマネント ジェネレーション (PermGen) によく似ています。ヒープの一部であるため、なぜこれを個別に報告することにしたのかわかりません。

あなたが見ている変動は、JVM が永続世代を縮小および拡大した結果であると思われます。これにより、非 PermGen の使用に使用できる報告された最大ヒープ領域がそれに応じて変化します。JMX によって報告されたヒープと非ヒープの最大値の合計を取得でき、この合計が 8G 制限で一定のままである場合、それはこの仮説を検証します。

于 2012-08-15T14:36:07.690 に答える
0

1 つの可能性は、JVM サバイバー スペースが最大サイズで変動していることです。

HeapMemoryUsage.max 属性を介して JMX によって報告される JVM の最大サイズは、ヒープの実際の最大サイズ (つまり、 -Xmx で設定されたもの) ではありません。

報告される値は、最大ヒープ サイズから最大サバイバー スペース サイズを引いたものです。

合計最大ヒープ サイズを取得するには、2 つの jmx 属性を追加します。

java.lang:type=Memory/HeapMemoryUsage.max + java.lang:type=MemoryPool,name=Survivor Space/Usage.max

(Oracle jdk 1.7.0_45でテスト済み)

于 2014-02-21T09:59:24.190 に答える