この問題は、特にLinuxx86-64で実行されているSunJavaJVMに関するものです。ヒープ制限と非ヒープ制限を設定した場合でも、SunJVMがシステムの物理メモリを大量に消費する理由を理解しようとしています。
私が実行しているプログラムは、複数のプラグイン/機能を備えたEclipse3.7です。最もよく使用される機能は、PDT、EGit、およびMylynです。次のコマンドラインスイッチを使用してEclipseを起動しています。
-nosplash -vmargs -Xincgc -Xms64m -Xmx200m -XX:NewSize=8m -XX:PermSize=80m -XX:MaxPermSize=150m -XX:MaxPermHeapExpansion=10m -XX:+UseConcMarkSweepGC -XX:CMSInitiatingOccupancyFraction=70 -XX:+UseCMSInitiatingOccupancyOnly -XX:+UseParNewGC -XX:+CMSIncrementalMode -XX:+CMSIncrementalPacing -XX:CMSIncrementalDutyCycleMin=0 -XX:CMSIncrementalDutyCycle=5 -XX:GCTimeRatio=49 -XX:MaxGCPauseMillis=50 -XX:GCPauseIntervalMillis=1000 -XX:+UseCMSCompactAtFullCollection -XX:+CMSClassUnloadingEnabled -XX:+DoEscapeAnalysis -XX:+UseCompressedOops -XX:+AggressiveOpts -Dorg.eclipse.swt.internal.gtk.disablePrinting
特に注目に値するのはスイッチです。
-Xms64m -Xmx200m -XX:NewSize=8m -XX:PermSize=80m -XX:MaxPermSize=150m
これらのスイッチは、JVMヒープを最大200 MBに、非ヒープを150 MBに制限する必要があります(JConsoleでラベル付けされた「CMS永続生成」および「コードキャッシュ」)。論理的には、JVMは合計350MBに加えてJVMに必要な内部オーバーヘッドを必要とします。
実際には、Linux 2.6以降のカーネルによって予約されている実際の物理メモリページを計算するps_mem.py(http://www.pixelbeat.org/scripts/ps_mem.py )によって計算されるように、JVMは現在のEclipseプロセスに544.6MBを使用します。 。これは、35%または約200MBの内部SunJVMオーバーヘッドです。
このオーバーヘッドを減らす方法についてのヒントはありますか?
ここにいくつかの追加情報があります:
$ ps auxw
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
me 23440 2.4 14.4 1394144 558440 ? Sl Oct12 210:41 /usr/bin/java ...
また、JConsoleによると、このプロセスでは160MBのヒープと151MBの非ヒープが使用されています。
Eclipseを実行するために余分な200MBを使用する余裕がないと言っているわけではありませんが、この無駄を減らす方法がある場合は、カーネルブロックデバイスバッファーまたはファイルキャッシュにその200MBを使用したいと思います。さらに、私は他のJavaプログラムでも同様の経験を持っています。おそらく、同様の調整を行うことで、それらすべてのオーバーヘッドを減らすことができます。
更新:質問を投稿した後、SOへの以前の投稿を見つけました:
ヒープなどのサイズが安定している場合でも、Sun JVMがRSSメモリをこれまで以上に消費し続けるのはなぜですか?pmap
問題を調査するために
使用する必要があるようです。