質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.22%

【JVM】VM引数で指定するメモリの目安について知りたいです。

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,877

ttdrop

score 20

お世話になります。

常駐プロセスとなるプログラムを稼働させ続けているのですが、
気になっている点が2点あります。
起動引数は以下を設定しています。

-Xms128m
-Xmx128m
-Xmn64m
-XX:MetaspaceSize=64m
-XX:MaxMetaspaceSize=128m

①S1領域
1回目のFGCが発生するまではかなりの時間がかかり、S1領域がずっと100%でした。
しかし、1度FGCが発生するとS1が0になり、その後FGCが頻発するようになりました。
これはXmxの値が小さいことが原因でしょうか?
※メモリ使用率については下記参照願います

②引数設定
プロセスを常駐させておくと、
GCは発生しているものの、継続的なメモリ上昇が見受けられ、
メモリリークのようなことが起きているように思われます。
これは引数設定に問題があるのでしょうか?
設定内容的には200m程度で収まる認識だったのですが、
タスクマネージャーから見ると240mに到達しており、現在も増えている状態です。

指摘事項などありましたら、
ご教示の程宜しくお願い致します。

jstatでメモリ使用率を表示したところ以下のようになりました。(抜粋)

  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT    CGC    CGCT     GCT
  0.00 100.00  62.50  99.84  96.52  90.35    170    1.020     0    0.000    10    0.049    1.068
  0.00 100.00  70.31  99.84  96.52  90.35    170    1.020     0    0.000    10    0.049    1.068
  0.00 100.00  79.69  99.84  96.52  90.35    170    1.020     0    0.000    10    0.049    1.068
  0.00 100.00  89.06  99.84  96.52  90.35    170    1.020     0    0.000    10    0.049    1.068
  0.00 100.00   3.08  99.93  96.52  90.35    171    1.026     0    0.000    12    0.056    1.082
  0.00 100.00  13.85  99.93  96.52  90.35    171    1.026     0    0.000    12    0.056    1.082
  0.00 100.00  21.54  99.93  96.52  90.35    171    1.026     0    0.000    12    0.056    1.082
  0.00 100.00  29.23  99.93  96.52  90.35    171    1.026     0    0.000    12    0.056    1.082
  0.00 100.00  38.46  99.93  96.52  90.35    171    1.026     0    0.000    12    0.056    1.082
  0.00 100.00  47.69  99.93  96.52  90.35    171    1.026     0    0.000    12    0.056    1.082
  0.00 100.00  55.38  99.93  96.52  90.35    171    1.026     0    0.000    12    0.056    1.082
  0.00 100.00  64.62  99.93  96.52  90.35    171    1.026     0    0.000    12    0.056    1.082
  0.00 100.00  72.31  99.93  96.52  90.35    171    1.026     0    0.000    12    0.056    1.082
  0.00 100.00  81.54  99.93  96.52  90.35    171    1.026     0    0.000    12    0.056    1.082
  0.00 100.00  90.77  99.93  96.52  90.35    171    1.026     0    0.000    12    0.056    1.082
  0.00 100.00   5.41 100.00  96.52  90.35    172    1.051     0    0.000    12    0.056    1.107
  0.00 100.00  21.62 100.00  96.52  90.35    172    1.051     0    0.000    12    0.056    1.107
  0.00 100.00  37.84 100.00  96.52  90.35    172    1.051     0    0.000    12    0.056    1.107
  0.00 100.00  54.05 100.00  96.52  90.35    172    1.051     0    0.000    12    0.056    1.107
  0.00 100.00  64.86 100.00  96.52  90.35    172    1.051     0    0.000    12    0.056    1.107
  0.00 100.00  81.08 100.00  96.52  90.35    172    1.051     0    0.000    12    0.056    1.107
  0.00 100.00  97.30 100.00  96.52  90.35    172    1.051     0    0.000    12    0.056    1.107
  0.00   0.00   7.35  90.93  96.09  89.89    173    1.068     1    0.176    12    0.056    1.300
  0.00   0.00  16.18  90.93  96.09  89.89    173    1.068     1    0.176    12    0.056    1.300
  0.00   0.00  25.00  90.93  96.09  89.89    173    1.068     1    0.176    12    0.056    1.300
  0.00   0.00  33.82  90.93  96.09  89.89    173    1.068     1    0.176    12    0.056    1.300
  0.00   0.00  41.18  90.93  96.09  89.89    173    1.068     1    0.176    12    0.056    1.300
  0.00   0.00  48.53  90.93  96.09  89.89    173    1.068     1    0.176    12    0.056    1.300
  0.00   0.00  57.35  90.93  96.09  89.89    173    1.068     1    0.176    12    0.056    1.300
  0.00   0.00  66.18  90.93  96.09  89.89    173    1.068     1    0.176    12    0.056    1.300
  S0     S1     E      O      M     CCS    YGC     YGCT    FGC    FGCT    CGC    CGCT     GCT
  0.00   0.00  91.94  98.74  96.25  90.07    223    1.681    23    3.501    32    0.137    5.319
  0.00   0.00   4.84  99.03  96.10  89.90    224    1.701    24    3.658    32    0.137    5.496
  0.00   0.00  11.29  99.03  96.10  89.90    224    1.701    24    3.658    32    0.137    5.496
  0.00   0.00  19.35  99.03  96.10  89.90    224    1.701    24    3.658    32    0.137    5.496
  0.00   0.00  29.03  99.03  96.10  89.90    224    1.701    24    3.658    32    0.137    5.496
  0.00   0.00  38.71  99.03  96.10  89.90    224    1.701    24    3.658    32    0.137    5.496
  0.00   0.00  46.77  99.03  96.10  89.90    224    1.701    24    3.658    32    0.137    5.496
  0.00   0.00  54.84  99.03  96.10  89.90    224    1.701    24    3.658    32    0.137    5.496
  0.00   0.00  64.52  99.03  96.10  89.90    224    1.701    24    3.658    32    0.137    5.496
  0.00   0.00  72.58  99.03  96.10  89.90    224    1.701    24    3.658    32    0.137    5.496
  0.00   0.00  82.26  99.03  96.10  89.90    224    1.701    24    3.658    32    0.137    5.496
  0.00   0.00  88.71  99.03  96.10  89.90    224    1.701    24    3.658    32    0.137    5.496
  0.00   0.00  96.77  99.03  96.10  89.90    224    1.701    24    3.658    32    0.137    5.496
  0.00   0.00   8.06  99.39  96.20  90.01    225    1.722    25    3.804    32    0.137    5.663
  0.00   0.00  16.13  99.39  96.20  90.01    225    1.722    25    3.804    32    0.137    5.663
  0.00   0.00  22.58  99.39  96.20  90.01    225    1.722    25    3.804    32    0.137    5.663
  0.00   0.00  32.26  99.39  96.20  90.01    225    1.722    25    3.804    32    0.137    5.663
  0.00   0.00  40.32  99.39  96.20  90.01    225    1.722    25    3.804    32    0.137    5.663
  0.00   0.00  48.39  99.39  96.20  90.01    225    1.722    25    3.804    32    0.137    5.663
  0.00   0.00  58.06  99.39  96.20  90.01    225    1.722    25    3.804    32    0.137    5.663
  0.00   0.00  66.13  99.39  96.20  90.01    225    1.722    25    3.804    32    0.137    5.663
  0.00   0.00  75.81  99.39  96.20  90.01    225    1.722    25    3.804    32    0.137    5.663
  0.00   0.00  83.87  99.39  96.20  90.01    225    1.722    25    3.804    32    0.137    5.663
  0.00   0.00  93.55  99.39  96.20  90.01    225    1.722    25    3.804    32    0.137    5.663
  0.00   0.00   3.23  99.74  96.27  90.09    226    1.741    26    3.950    32    0.137    5.829
  0.00   0.00  11.29  99.74  96.27  90.09    226    1.741    26    3.950    32    0.137    5.829
  0.00   0.00  20.97  99.74  96.27  90.09    226    1.741    26    3.950    32    0.137    5.829
  0.00   0.00  27.42  99.74  96.27  90.09    226    1.741    26    3.950    32    0.137    5.829
  0.00   0.00  37.10  99.74  96.27  90.09    226    1.741    26    3.950    32    0.137    5.829
  0.00   0.00  46.77  99.74  96.27  90.09    226    1.741    26    3.950    32    0.137    5.829

jconsole結果
イメージ説明

イメージ説明

イメージ説明

FGC頻発例(1度目までは時間がかかったが、次回以降で間隔が短い)
イメージ説明

イメージ説明

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

メモリリークのようなことが起きているように思われます。
これは引数設定に問題があるのでしょうか?

右肩上がりにヒープ使用量が上がっているアプリケーションは、プログラム中に解放漏れのオブジェクトがあることを疑うべきです。

まずはヒープ使用量をツール(jconsole等)を使って確かめてください。
OutOfMemoryError の調べ方という記事もメモリリークの調査をする上で参考になると思います。

VM引数で指定するメモリの目安

まずはメモリリークを直してください。

直した仮定で話を勧めますが、その場合のヒープ使用量は同じ高さの波状になるはずです。
その状態でアプリケーションにおいて一番メモリを使用する操作(容量の大きいオブジェクトを大量にインスタンス化するなどの処理が含まれる操作)を行ってください。

その操作を行うことでOutOfMemoryErrorになるようであれば、問題が再発しなくなるまで割り当てるメモリを増やしてください。再発しなくなればそれが目安です。

ただ、大抵の場合はデフォルトのヒープサイズで足りるはずなので、事情がない限り割り当てるメモリは変更しないのが妥当です。

また、割り当てるメモリを変える前にメモリを無駄に多く消費している部分がプログラム中にないかを確認してください。あればその修正を行ってください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/03 14:48

    現在Eclipse MATで調べていますが、
    ・java.util.zip.ZipFile
    ・java.lang.Class
    ・java.lang.Thread
    といったクラスがリーク疑惑対象として表示されましたが、
    あまり原因と思われる箇所ではありませんでした。
    (イマイチ使いこなせていないのでもう少し詳しく調べてみてはいます)
    また、今回稼働させているプロセスは一連の短い処理を大量に繰り返し実施しているものになり、
    アプリケーション内のクラスファイルは大した数ではないはずなのです...

    キャンセル

  • 2019/09/03 15:25 編集

    中身を知らないため抽象的な意見になりますが、一連の短い処理の中から怪しい部分を見つけて、それをコメントアウトなどで一時的に無効にすることで非ヒープ使用率が高くなる箇所を特定できると思います。

    キャンセル

  • 2019/09/03 15:35

    例えば、ClassPoolから動的にクラスをロードするような処理がプログラム中(外部ライブラリ含め)に組み込まれている可能性が挙げられます。

    他にもMetaspaceによるメモリリークが起きたときのチューニング方法という文献が見つかったので、こちらも参考になるかもしれません。
    https://software.fujitsu.com/jp/manual/manualfiles/m170006/b1ws1303/01z200/b1303-00-11-06-01.html

    キャンセル

0

①S1領域
1回目のFGCが発生するまではかなりの時間がかかり、S1領域がずっと100%でした。
しかし、1度FGCが発生するとS1が0になり、その後FGCが頻発するようになりました。
これはXmxの値が小さいことが原因でしょうか?

ヤング世代の割り当てがヒープ全体のサイズと比較して1/2と大きいことが原因と考えられます。

以下のOracle公式ドキュメントに記載されていますが、Xmnがヒープと比較して大きすぎるとFGCばかり実行されてしまうようです。

Oracle公式ドキュメント

②引数設定
プロセスを常駐させておくと、
GCは発生しているものの、継続的なメモリ上昇が見受けられ、
メモリリークのようなことが起きているように思われます。
これは引数設定に問題があるのでしょうか?
設定内容的には200m程度で収まる認識だったのですが、
タスクマネージャーから見ると240mに到達しており、現在も増えている状態です。

「-Xmx128m」と「-XX:MaxMetaspaceSize=128m」で最大で256MBは使えるように設定されてるおり、240MBなら問題ないと思いますが認識合ってますか?

インスタンスやクラスを使用しなくなったらメモリが開放され、使用されるメモリが小さくなるものと勘違いされやすいですが、通常、最大サイズの範囲内で使用メモリが段々と増えていくことはそれほど珍しいことではありません。

例えば、クラスのアンロードは以下の条件を満たすと起こりえますが、条件を全て満たせば必ずされるわけではありません。(メモリに余裕がなくなれば話は別でしょうけど)

  1. 番号リストヒープ中からそのクラスのインスタンスがなくなること。
  2. そのクラスの static メソッドを実行中のスレッドがいないこと。
  3. そのクラスをロードしたクラスローダーを現わす ClassLoader 派生型のインスタンスがヒープ中からなくなること。

Javaの場合、メモリリークで気をつけなければいけないことは、使用できる最大サイズまでメモリを使用した状態でFGCが頻繁に起きることです。FGCでメモリが開放できず、しかし、メモリが足りない場合、最終的にFGCにCPUのほとんどを持っていかれ、何も処理をできなくなり、MemoryOutOfErrorが起きます。
逆を言えば、最大サイズまでメモリ使用量が増えたとしてもGCが適切に適度に行われている分には問題ありません。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/09/04 17:46

    ありがとうございます。
    メモリを大きく取って、とやってみたのですが、
    メモリの上昇値がわずかであるため、FGCが走るまでに時間がかかりすぎたため、
    メモリを少なめにしたところ、途中でプロセスが停止しました。
    OutOfMemoryなどのログは出ていません...
    コンソールがいきなり止まったような状態になりました。

    gc.logは後ろの方を抜粋すると、↓のような感じでした。


    [917.602s][info][gc,phases,start] GC(14121) Phase 1: Mark live objects
    [917.632s][info][gc,stringtable ] GC(14121) Cleaned string and symbol table, strings: 24352 processed, 0 removed, symbols: 152966 processed, 0 removed
    [917.632s][info][gc,phases ] GC(14121) Phase 1: Mark live objects 30.205ms
    [917.632s][info][gc,phases,start] GC(14121) Phase 2: Prepare for compaction
    [917.635s][info][gc,phases ] GC(14121) Phase 2: Prepare for compaction 3.198ms
    [917.635s][info][gc,phases,start] GC(14121) Phase 3: Adjust pointers
    [917.648s][info][gc,phases ] GC(14121) Phase 3: Adjust pointers 12.144ms
    [917.648s][info][gc,phases,start] GC(14121) Phase 4: Compact heap
    [917.650s][info][gc,phases ] GC(14121) Phase 4: Compact heap 2.490ms
    [917.654s][info][gc,heap ] GC(14121) Eden regions: 0->0(6)
    [917.654s][info][gc,heap ] GC(14121) Survivor regions: 0->0(1)
    [917.654s][info][gc,heap ] GC(14121) Old regions: 24->24
    [917.654s][info][gc,heap ] GC(14121) Humongous regions: 0->0
    [917.654s][info][gc,metaspace ] GC(14121) Metaspace: 46768K->46768K(100352K)
    [917.654s][info][gc ] GC(14121) Pause Full (G1 Evacuation Pause) 23M->23M(24M) 52.973ms
    [917.655s][info][gc,cpu ] GC(14121) User=0.11s Sys=0.00s Real=0.05s
    [917.655s][info][gc,task ] GC(14123) Using 2 workers of 4 for full compaction
    [917.655s][info][gc,start ] GC(14123) Pause Full (G1 Evacuation Pause)
    [917.655s][info][gc,phases,start] GC(14123) Phase 1: Mark live objects
    [917.691s][info][gc,stringtable ] GC(14123) Cleaned string and symbol table, strings: 24352 processed, 0 removed, symbols: 152966 processed, 0 removed
    [917.691s][info][gc,phases ] GC(14123) Phase 1: Mark live objects 35.582ms
    [917.691s][info][gc,phases,start] GC(14123) Phase 2: Prepare for compaction
    [917.694s][info][gc,phases ] GC(14123) Phase 2: Prepare for compaction 3.550ms
    [917.694s][info][gc,phases,start] GC(14123) Phase 3: Adjust pointers
    [917.708s][info][gc,phases ] GC(14123) Phase 3: Adjust pointers 13.340ms
    [917.708s][info][gc,phases,start] GC(14123) Phase 4: Compact heap
    [917.712s][info][gc,phases ] GC(14123) Phase 4: Compact heap 4.624ms
    [917.716s][info][gc,heap ] GC(14123) Eden regions: 0->0(6)
    [917.716s][info][gc,heap ] GC(14123) Survivor regions: 0->0(1)
    [917.716s][info][gc,heap ] GC(14123) Old regions: 24->24
    [917.716s][info][gc,heap ] GC(14123) Humongous regions: 0->0
    [917.716s][info][gc,metaspace ] GC(14123) Metaspace: 46768K->46768K(100352K)
    [917.716s][info][gc ] GC(14123) Pause Full (G1 Evacuation Pause) 23M->23M(24M) 61.738ms
    [917.717s][info][gc,cpu ] GC(14123) User=0.11s Sys=0.00s Real=0.06s
    [917.717s][info][gc,marking ] GC(14122) Concurrent Mark Abort
    [917.717s][info][gc ] GC(14122) Concurrent Cycle 115.387ms
    [917.717s][info][gc,start ] GC(14124) Pause Young (Normal) (G1 Evacuation Pause)
    [917.717s][info][gc,task ] GC(14124) Using 4 workers of 4 for evacuation
    [917.717s][info][gc,phases ] GC(14124) Pre Evacuate Collection Set: 0.0ms
    [917.717s][info][gc,phases ] GC(14124) Evacuate Collection Set: 0.3ms
    [917.717s][info][gc,phases ] GC(14124) Post Evacuate Collection Set: 0.1ms
    [917.717s][info][gc,phases ] GC(14124) Other: 0.1ms
    [917.718s][info][gc,heap ] GC(14124) Eden regions: 0->0(6)
    [917.718s][info][gc,heap ] GC(14124) Survivor regions: 0->0(1)
    [917.718s][info][gc,heap ] GC(14124) Old regions: 24->24
    [917.718s][info][gc,heap ] GC(14124) Humongous regions: 0->0
    [917.718s][info][gc,metaspace ] GC(14124) Metaspace: 46768K->46768K(100352K)
    [917.718s][info][gc ] GC(14124) Pause Young (Normal) (G1 Evacuation Pause) 23M->23M(24M) 0.731ms
    [917.718s][info][gc,cpu ] GC(14124) User=0.00s Sys=0.00s Real=0.00s

    キャンセル

  • 2019/09/05 10:02

    ログを見る限り、確かにFULL GCが頻発しており、実行前と実行後でほとんど変わってない(23MB -> 23MB)ことが見て取れますね。

    ただ、ヒープサイズの最大が24MBはあまりに小さすぎると思いますがどうでしょうか?

    無理やりヒープサイズを小さくしてハングアップさせても意味がありません。
    何故なら、全くメモリリークしていなくてもメモリの割当が小さければFGCが頻発します。

    GCを効率的に行うにはヒープにある程度の空きが必要です。
    JVMは必要に応じてメモリをOSに要求し、一度、メモリを確保した後、GCを行っても確保したメモリを手放すことはありません。GCで開放されてもJVMに割り当てられたままです。JVMが自分で再利用するだけです。

    JVMのメモリ管理は我々が考えているよりずっと複雑です。
    同じ処理の繰り返しなのでメモリの使用量は最初の一回以外全く増えないはずだ、メモリ使用量が増えるのはメモリリークのせいだなんて思い込むのは危険です。

    メモリリークが起きていると信じている理由はどこにありますか?

    線形的にメモリ使用量がずっと増え続けてますか?
    最初のうちはメモリ使用量が段々と増え、ある程度時間が経ったらほとんどメモリ使用量増えなくなってませんか?

    繰り返しになりますが、もし、ヒープサイズ(Xmx)に余裕をもたせて、それでもFGCが頻発するようでしたら、メモリリークの可能性が高いです。
    余裕をもたせた結果、FGCは頻発しない。または、ヒープサイズの最大まで全然達する気配がないのであれば、それは問題なくメモリが管理されてるということです。

    キャンセル

  • 2019/09/05 12:12

    確かに上昇比率としては、徐々にゆるやかになっていくグラフとなっています。。
    メモリリークが起きているという根拠はなく、むしろ起きていないという前提でいました。

    > 同じ処理の繰り返しなのでメモリの使用量は最初の一回以外全く増えないはずだ、メモリ使用量が増えるのはメモリリークのせいだなんて思い込むのは危険です。

    仰る通りです。メモリの上昇に関して過剰反応していました。
    また、本来の運用とは遠い値までヒープを下げる等、再現性に欠けておりました。

    一度、本来系の設定値で連続稼働させ、長い目でどうなっているのか確認したいと思います。
    色々とアドバイスを頂きありがとうございますmm

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.22%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる