2016-07-06 31 views
1

私はjavaフレームワークのようなマイクロサービスを持っています。多くのJavaプロセスは単一のボックス(ubuntu 14.04.4 LTS)で動作します。 Javaプロセスは多くのシステムメモリを使用しているため、スワップ領域が頻繁に使用されます。 jstat gcのレポートでは、システムのメモリ使用量については説明していません。すべてのJavaプロセスは、システムに戻すメモリを与えるためにJVMを強制的にヒープ使用と比較して、Javaアプリケーションの巨大なシステムメモリ使用量

-XX:MinHeapFreeRatio=20 -XX:MaxHeapFreeRatio=40 -XX:GCTimeRatio=4 -XX:AdaptiveSizePolicyWeight=90 

パラメータを使用して実行します。パラメータがなければ問題は解決されません。一部のJavaコンポーネントは、nashornエンジンを使用していくつかの機能をスクリプト化します。

ここで行動を説明できる人はいますか?

巨大なシステムメモリの使用を制限するjvmの値はありますか?

jvmのメモリ割り当てを制限する方法をOSに指示する方法はありますか?

一部のデータ:

成分A(nashorn有する)

トップ:

PID USER  PR NI VIRT RES SHR S %CPU %MEM  TIME+ COMMAND 
2400 xxxxxx 20 0 13.933g 807496 7332 S 0.0 2.5 4180:15 java 

2400 -gc JSTAT:

S0C S1C S0U S1U  EC  EU  OC   OU  MC  MU CCSC CCSU YGC  YGCT FGC FGCT  GCT 
512.0 512.0 0.0 400.0 19456.0 12751.6 62464.0 59862.3 89688.0 84866.6 10624.0 9440.4 2165265 15977.896 16816 1813.836 17791.732 
  • 容量:約180 MB
  • 使用法:ca. 165 MB
  • システムリソース:ca. 800 MB

なぜコンポーネントはGC領域の4倍のメモリを使用しますか?

成分B

トップ(nashornなし):

PID USER  PR NI VIRT RES SHR S %CPU %MEM  TIME+ COMMAND 
19476 xxxx  20 0 13.465g 120436 7836 S 7.0 0.4 22:40.76 java 

JSTAT 19476 -gc:

S0C S1C S0U S1U  EC  EU  OC   OU  MC  MU CCSC CCSU YGC  YGCT FGC FGCT  GCT 
512.0 512.0 0.0 0.0 41472.0 25408.7 343040.0 7164.5 17664.0 17183.1 2048.0 1919.4 3650 10.806 939 16.788 27.594 
  • 容量:約403 MB
  • 使用法:ca. 52メガバイト
  • システムリソース:120メガバイトここ

はGC面積容量は、実際のシステムのメモリ使用量よりも大きくしています。それでもシステムのメモリ使用量はGC領域の2倍です。 IMOこのコンポーネントはライブラリなどが部分的にメモリにもマップされているので正常に動作します。(nashornなし)

成分C

トップ:

PID USER  PR NI VIRT RES SHR S %CPU %MEM  TIME+ COMMAND 
2272 xxxxxx 20 0 13.382g 922944 11108 S 0.7 2.8 40033:41 java 

JSTAT -gc 2272:

S0C S1C S0U S1U  EC  EU  OC   OU  MC  MU CCSC CCSU YGC  YGCT FGC FGCT  GCT 
1024.0 1024.0 868.0 0.0 36352.0 23866.1 76800.0 56580.2 68864.0 64571.1 8448.0 7460.6 31974159 199295.501 844692 134644.040 333939.541 
  • 容量:約190 MB
  • 使用法:ca. 152メガバイト
  • システムリソース:920メガバイト

成分がより6倍GC領域のメモリを使用しない理由?

+2

私は知っているが、それでもなお役に立たない。あなたは分散コンピューティングの最初のルールを知っていますか? *コンピューティングを配布しない*。私は、小さなサービスをたくさん持っていると多くの問題を解決できることを理解していますが、それはあなたの環境に合わせて調整するべきではありません。私はちょっと、あなたが最終的にそのような問題に遭遇する(同じノード上にある)非常に多くの異なるJVMを使用するというアイデアを得ることはできません...正解は複数のノードを使うか、 – GhostCat

+0

私は答えを見てお勧めします:http://stackoverflow.com/questions/14763079/what-are-the-xms-and-xmx-parameters-when-starting-jvms –

+0

これは、 linux/ubuntu上のメモリ管理.Windows上で実行すると、私はそれらの問題を観察しません。 Xmx/Xmsフラグはヒープサイズを制限しますが、システムメモリの使用に与える影響は少なくなります。 –

答えて

1

誰か行動をここで説明できますか?

メモリの使用について単一の説明はありませんが、多くの要因があります。

  • 使用NMTメモリマップファイルを識別するためにpmap -x <pid>を使用してJVM
  • の様々な内部部品によって割り当てられているどのくらいのメモリの概要を取得します。
  • は(彼らはPMAPで[anon]マッピングの一部として表示)、ダイレクトメモリバッファを探すためにヒープ・ダンプを取るか、または直接バッファによって割り当てられた量を特定するためのメモリ検査を持つYourkitを使用

を越えて各JVMには基本的なメモリ消費があり、ガベージコレクタの呼吸スペースが必要であることを考慮する必要があります。共有JVMで複数のサービスを実行すると、これらのベースラインコストを償却することができます。

仮想メモリシステムの複雑さのために、difference between used, committed, reserved and resident memoryにも注意する必要があります。

巨大なシステムメモリの使用を制限するjvmパターンはありますか?

これは原因によって異なります。

管理されたヒープの場合、make it yield unused memory back to the OS more swiftlyには可能ですが、パフォーマンス上のペナルティがあります。

関連する問題