2

commons IO の Apache Tailer を使用して、マシン上の多数のログ ファイルに対して "tail -f" のようなプログラムを作成しました。基本的にはスレッドで実行され、ファイルを RandomAccessFile として開き、その長さをチェックし、最後までシークします。収集したすべてのログ行をクライアントに送信します。

それについてのやや不快なことは、Linux では膨大な量の VIRT メモリを表示できることです。現在、16.1g VIRT (!!) と 203m RES と表示されています。

仮想メモリについて少し調べてみたところ、多くの場合「心配する必要はない」ことがわかりました..しかし、それでも 16 GB ですか? それは本当に健康ですか?

pmapでプロセスを見ると、ログファイル名が表示されていないので、メモリマップされていないと思います..そして、pmap出力の「マッピング」列にある「[ anon ]」を読みました(man pmap) 「割り当てられたメモリ」。それはどういう意味ですか?:)

ただし、 pmap -x は次を示します。

Address           Kbytes     RSS   Dirty Mode   Mapping
...
----------------  ------  ------  ------
total kB        16928328  208824  197096

..ですから、結局のところ、RAMに常駐していないと思います..しかし、このようなファイルを開くとき、ファイルの最後までシークするときなど、メモリに関してどのように機能しますか?

これらすべての GB の VIRT メモリについて心配する必要がありますか? 現在、84 個の異なるログ ファイルを「監視」しており、ディスク上のこれらの合計サイズは 31414239 バイトです。

編集: 別の、「本番に似ていない」Linuxマシンでテストしたところ、同じ数値が得られませんでした。VIRT は最大で 2.5 GB に達しました。デフォルトの JVM 設定の一部が異なることがわかりました (「java -XX:+PrintFlagsFinal -version」で確認):

Value              Small machine    Big machine
InitialHeapSize    62690688         2114573120
MaxHeapSize        1004535808       32038191104
ParallelGCThreads  2                13

..それで、うーん..最大制限が(かなり)高いので、大きなマシンでより多くのヒープを取得すると思いますか?また、これらの値を常に明示的に指定することをお勧めします..

4

1 に答える 1

1

いくつかのこと:

  • 各 Tailer インスタンスには独自のスレッドがあります。そして、各スレッドにはスタックがあります。デフォルトでは (64 ビット JVM 上で) スレッド スタックはそれぞれ 1Mb であるため、スタックには 84Mb を使用します。起動時に -Xss オプションを使用してそれを減らすことを検討してください。

  • 大きい仮想サイズが必ずしも悪いわけではありません。しかし、それが物理メモリの需要につながる場合...そしてそれほど多くない場合...それは本当に悪いことです。


うーん、実際にはJVM引数なしで実行しています。それって良いのそれとも悪いの?:-)

今、私は分かる。はい、悪いです。大規模な 64 ビット マシンでの JVM のデフォルトのヒープ サイズは、実際に必要なサイズをはるかに超えています。

アプリケーションがログ行の単純な処理のみを行っていると仮定すると、最大ヒープ サイズを比較的小さいサイズ (64Mb など) に設定することをお勧めします。そうすれば、リークが発生した場合でも、実際のメモリを大量に消費してシステムの残りの部分に影響を与えることはありません。

于 2013-03-14T16:47:00.163 に答える