2011-02-04 12 views
3

背景:Javaのメモリ使用量に影響を与えるLinux構成ですか?

私は、私は私のWebアプリケーションの一部として開始Javaの背景労働者のセットを持っています。私はUbuntu 10.10でローカルに開発し、Ubuntu 10.04LTSサーバー(メディアテンプル(ve)インスタンス)に展開します。

彼らは両方とも同じJVMを実行しています:Sun JVM 1.6.0_22-b04。初期化スクリプトの一部として、各ワーカーは明示的にXmx,Xms、およびXX:MaxPermGenの設定で開始されます。

しかし、10人の従業員全員が250MBを使用していますが、サーバでは2.7GB以上を使用しています。

これを追跡する方法はわかりません。私はUbuntu(とカーネル)バージョンが違いを生むかもしれないと思ったが、古い10.04 VMを試してみたところ、期待通りに動作していた。

私は、マシンが(htopによる)バッファやキャッシュにメモリを使用していないように見えました。 (編集済み)


いくつかの情報:

(server) 
[email protected]:/app/axir/target# uname -a 
Linux devel 2.6.18-028stab069.5 #1 SMP Tue May 18 17:26:16 MSD 2010 x86_64 GNU/Linux 

(local) 
[email protected]:~$ uname -a 
Linux beastie 2.6.35-25-generiC#44-Ubuntu SMP Fri Jan 21 17:40:44 UTC 2011 x86_64 GNU/Linux 

(編集済み) 比較PS出力:(ps -eo "ppid,pid,cmd,rss,sz,vsz"

PPID PID CMD       RSS SZ   VSZ 
(local) 
1588 1615 java -cp axir-distribution. 25484 234382 937528 
1615 1631 java -cp /home/wiktor/Code/ 83472 163059 652236 
1615 1657 java -cp /home/wiktor/Code/ 70624 89135 356540 
1615 1658 java -cp /home/wiktor/Code/ 37652 77625 310500 
1615 1669 java -cp /home/wiktor/Code/ 38096 77733 310932 
1615 1675 java -cp /home/wiktor/Code/ 37420 61395 245580 
1615 1684 java -cp /home/wiktor/Code/ 38000 77736 310944 
1615 1703 java -cp /home/wiktor/Code/ 39180 78060 312240 
1615 1712 java -cp /home/wiktor/Code/ 38488 93882 375528 
1615 1719 java -cp /home/wiktor/Code/ 38312 77874 311496 
1615 1726 java -cp /home/wiktor/Code/ 38656 77958 311832 
1615 1727 java -cp /home/wiktor/Code/ 78016 89429 357716 

(server) 
22522 23560 java -cp axir-distribution. 24860 285196 1140784 
23560 23585 java -cp /app/axir/target/a 100764 161629 646516 
23560 23667 java -cp /app/axir/target/a 72408 92682 370728 
23560 23670 java -cp /app/axir/target/a 39948 97671 390684 
23560 23674 java -cp /app/axir/target/a 40140 81586 326344 
23560 23739 java -cp /app/axir/target/a 39688 81542 326168 

は、彼らは非常によく似ています。実際、問題は、サーバ上の仮想メモリ使用量(3.2GB)を加算すると、使用されるメモリが2.4GBに近づきます(freeによる)が、ローカルに使用される仮想メモリははるかに本格的な4.7GBだが実際には〜250MBしか使わない。たぶん記憶は積極的に共有されていないようです。オプションは、デフォルトで「-server Javaの私は、サーバー上で知っているように(それはも可能です場合)

Wiktor第

+0

はサーバー64ビットですか? –

+0

はい、ローカルクライアントもそうです。 – wmacura

+0

は両方の環境で動作するJavaクラスのデータ共有ですか? java -Xshare:onを実行して、それが正しいことを確認してください。また、あなたのjvmsに対してjmapを実行して、メモリがどのようにマップされているかを確認してください。おそらく、何らかの理由でジャンボ・サイズの動的libがサーバー上に存在する可能性があります。 – Ron

答えて

1

、ご協力いただきありがとうございます、多分これは、この問題をもたらします。クライアントで-serverオプションを指定して実行してください。

+0

ああ、良いアイデア。実行スクリプトをローカルで変更して、引数の中に '-server'オプションを追加しました。しかし、それは効果がなかったようです。同様に、サーバー上で '-client'を実行してみました。 – wmacura

+0

2つのVMの違いを 'jconsole'(JMX)のVM設定でVM Summaryタブで確認できます。 – ksimon

+0

Hmm。彼らはお互いに同程度です。 GCの後では、どちらも約3MBのRAMを使用します。彼らはどちらも22のスレッドを持っています。 PermGenは15.7MBです。明らかに異なるのは、2,106クラスがロードされ(サーバー)、0が共有されていることです。もう1つは2,093クラスがロードされ(ローカル)、0は共有されています。 「システムプロパティ」の下では、違いは(私はdiffを実行した) 'os.version'、' sun.jnu.encoding'、 'user.dir'、' user.home'、 'user.name'、' user .timezone'は重要ではないようです。 – wmacura

関連する問題