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