Pivotal Knowledge Base

フォローする

ヒープメモリにおける問題へのトラブルシューティング

適用範囲

GemFire 6 以降

目的

本記事の目的は、ヒープメモリ問題のトラブルシューティングを行ういくつかの一般的な方法を示すことである。

解説

ヒープメモリ問題の発生を知る一つの方法は、'Java heap space' というメッセージを伴う OutOfMemoryError が GemFire によってスローされたことの確認である。他に多くのエラーメッセージが OutOfMemoryError と同時に出力されるかもしれないが、OutOfMemoryError 発生後の任意のエラーは多くの場合は無視してもよい。なぜなら、それらはメモリ関連問題の結果である可能性が高いためである。その際、エラーメッセージには 'Java heap space' とうメッセージが含まれ、'unable to create new native thread' というメッセージは含まれない。後者のメッセージが含まれる場合の詳細はナレッジベース記事「ネイティブメモリにおける問題」を参照のこと。以下、例を示す。

[severe 2009/02/23 19:38:48.293 UTC <Gateway Event Processor> tid=0xbd] Uncaught exception in thread <Gateway Processor>
java.lang.OutOfMemoryError: Java heap space

ヒープメモリ関連問題があるかどうか確認する他の方法は、gemfire stats コマンドか VSD を用いて、与えられた GemFire 統計ファイルに含まれる、free、used あるいは maximum heap memory 値を出力することである。また、used、maximum heap memory 値を含むいくつかのカテゴリーが存在する。最も有用なカテゴリーは以下である。
VMMemoryUsageStats-vmHeapMemoryStats
VMMemoryPoolStats-CMSOldGen-Heapmemory

トラブルシューティングのヒント

VSD あるいは gemfire stats コマンドを用いて、統計ファイルに記録されたメモリ使用状況を調査してみよう。以下の例では gemfire stats コマンドを使用している。ここでは、gemfire stats コマンドを用いて、以下のように、与えられた GemFire 統計ファイルに含まれる、VMMemoryUsageStats-vmHeapMemoryStats の maxMemory、usedMemory 値、VMMemoryPoolStats-XXOldGen-Heapmemory の maxMemory、usedMemory 値、VMStats の freeMemory 値を出力している。

以下の gemfire stats コマンドの例では、stats.gfs ファイルにおける VMMemoryUsageStats-vmHeapMemoryStats の maxMemory、usedMemory 値を出力している。

$ gemfire stats vmHeapMemoryStats.maxMemory -archive=stats.gfs
[info] Found 1 match for "vmHeapMemoryStats:VMMemoryUsageStats.maxMemory"
vmHeapMemoryStats, 7980, VMMemoryUsageStats: "2009/02/23 16:49:50.157 UTC" samples=5511
maxMemory bytes: samples=5511 min=28633137152 max=30870077440 average=30743435202.68 stddev=517011962.91

$ gemfire stats vmHeapMemoryStats.usedMemory -archive=stats.gfs
[info] Found 1 match for "vmHeapMemoryStats:VMMemoryUsageStats.usedMemory"
vmHeapMemoryStats, 7980, VMMemoryUsageStats: "2009/02/23 16:49:50.157 UTC" samples=5511
usedMemory bytes: samples=5511 min=352716120 max=25037825520 average=6330675097.48 stddev=3523402783.98

以下の gemfire stats コマンドの例では、stats.gfs ファイルにおける VMMemoryPoolStats-XXOldGen-Heapmemory の maxMemory、usedMemory 値を出力している。この場合、両方のケースで max が同値である。これは、メモリ不足の状態を示している。

$ gemfire stats "PS Old Gen-Heap memory.currentUsedMemory" -archive=stats.gfs
[info] Found 1 match for "PS Old Gen-Heap memory.currentUsedMemory"
PS Old Gen-Heap memory, 7980, VMMemoryPoolStats: "2009/02/23 16:49:50.157 UTC" samples=5511
currentUsedMemory bytes: samples=5511 min=1088016 max=21474836480 average=954817373.72 stddev=3840947896.44
$ gemfire stats "PS Old Gen-Heap memory.currentMaxMemory" -archive=stats.gfs
[info] Found 1 match for "PS Old Gen-Heap memory.currentMaxMemory"
PS Old Gen-Heap memory, 7980, VMMemoryPoolStats: "2009/02/23 16:49:50.157 UTC" samples=5511
currentMaxMemory bytes: samples=5511 min=21474836480 max=21474836480 average=21474836480 stddev=0

以下の gemfire stats コマンドの例では、stats.gfs ファイルにおける VMStats の freeMemory 値を出力している。

$ gemfire stats vmStats.freeMemory -archive=stats.gfs
[info] Found 1 match for ":VMStats.freeMemory"
vmStats, 7980, VMStats: "2009/02/23 16:49:50.157 UTC" samples=5511
freeMemory bytes: samples=5511 min=3595311632 max=30517361320 average=24403029136.91 stddev=4009011946.31

解決策

ヒープメモリ関連問題を解消する方法はいくつか存在する。

  • -Xmx VM 引数にて、当該 VM で使用可能な最大ヒープ容量を増やす。
  • 追加マシン全体に渡ってデータを分散させるためパーティションリージョンを適用する。
  • リージョンのメモリ使用量を減らすために、リージョンデータの overflow や expiration を行う。

コメント

Powered by Zendesk