質問

いるJavaアプリケーションの下でプログラムを利用しています。.

私はアプリケーションを起動し、デフォルトの最大ヒープサイズ(64MB)の使用を参照してください、トップアプリ240MBの仮想メモリの割り当てます。この問その他のソフトウェアは、"コンピューターは比較的資源が限られます。

の仮想メモリ使用されませんがとにかく調査を実施しているのは、同じか、そのヒープを制限する OutOfMemoryError スローされます。また、同じアプリケーションをwindowsおよびいたように、これまでとは違った仮想メモリサイズのヒープサイズが同じです。

直しとかは出来ないんですかねますので設定では仮想メモリ使用のためのJavaプロセス下でのLinux?

編集1:でも問題ありませんのヒント.問題は場合に設定し、ヒープの128MB、例えば、Linux割り当て210MBの仮想メモリが不要です。**

編集2:を使用 ulimit -v きの量を制限する仮想メモリ。そうすれば、設定は以下204MB、その適な走りにもする必要はありません204MB、64MBです。きたいと思っていましたその理由を理解するにはJavaを必要とで仮想メモリ。この変化。

編集3:他にもいくつか途中でアプリケーションシステムが導入されています。のシステムは仮想メモリ制限(からのコメント、重要な詳細)。

役に立ちましたか?

解決

これは、長年の苦情Javaで大きく意味がないし、一般のみに誤った情報です。通常の要因というように"こんにちは世界Java10メガバイト!はありません。 でも、ここんにちは世界64ビットのJVMの請求に4ギガバイト...少なくとも一つの形を測定した。

java -Xms1024m -Xmx4096m com.example.Hello

異なる測定方法メモリ

Linux、 トップ コマンドで複数の番号。こちらは何か"というのこんにちは世界に例:

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 2120 kgregory  20   0 4373m  15m 7152 S    0  0.2   0:00.10 java
  • VIRTの仮想記憶空間のメモリー:和の全ての仮想メモリマップを以下に示します(下記を参照)。これは、主意味がある場合を除き、いします(下記参照)。
  • RESのセットサイズ:のページ数は現在のアプリです。ほとんどの場合、この番号がそのまま使う場合は"大きすぎます。" いますが、残念ながらない非常に良い番号がつJava.
  • SHRでは、住民の記憶を共有する必要のあるその他のプロセス。のためのJavaプロセスでは通常、限定共有ライブラリとメモリマップJARfiles.この例では、私たJavaプロセス、その疑いの7kは図書館の利用へと重点が移りつつある。
  • スワップのないonデフォルトとなりました。の量を指し、値が大きいほどの仮想メモリは、現在居住者はディスクにより、 かどうかの実際のスワップスペース.OSのは非常に良いを抑えることがで活躍ページをRAM上でのみ治療のための入れ替え(1)購入りメモリ、または(2)工程数の削減に貢献で無視する。

の状況Windowsタスクマネージャーは少し複雑化してきております。Windows XPでは、"メモリ使用量"および"仮想メモリサイズ"列が、 公式文書 には、そのことができる。Windows Vista、Windows7項目の追加、彼らは実際に 文書化され.これらのうち、"Working Set(ワーキングセット"測定が最も有用であること。で約に対応する和RES、SHRプログラムを利用しています。.

を理解する仮想メモリ-マップ

仮想メモリを消費するプロセスの合計であるのにメモリマップを以下に示します.このセンターのホームページ(例えば、Javaヒープ)が、ものすべての共有ライブラリとメモリマップファイルを使用してメッシュ作成を開始します。Linuxを使用できます pmap コマンドを参照くださいこのリストは、マップのスペース(これからの私のようにを参照してLinuxで私が使用思いが相当のツールWindows)で作成しています。こちらの抜粋からのメモリマップの"Hello World"プログラム全体のメモリマップは100以上のラインは、長いるのも珍しいことではないにして千線一覧です。

0000000040000000     36K r-x--  /usr/local/java/jdk-1.6-x64/bin/java
0000000040108000      8K rwx--  /usr/local/java/jdk-1.6-x64/bin/java
0000000040eba000    676K rwx--    [ anon ]
00000006fae00000  21248K rwx--    [ anon ]
00000006fc2c0000  62720K rwx--    [ anon ]
0000000700000000 699072K rwx--    [ anon ]
000000072aab0000 2097152K rwx--    [ anon ]
00000007aaab0000 349504K rwx--    [ anon ]
00000007c0000000 1048576K rwx--    [ anon ]
...
00007fa1ed00d000   1652K r-xs-  /usr/local/java/jdk-1.6-x64/jre/lib/rt.jar
...
00007fa1ed1d3000   1024K rwx--    [ anon ]
00007fa1ed2d3000      4K -----    [ anon ]
00007fa1ed2d4000   1024K rwx--    [ anon ]
00007fa1ed3d4000      4K -----    [ anon ]
...
00007fa1f20d3000    164K r-x--  /usr/local/java/jdk-1.6-x64/jre/lib/amd64/libjava.so
00007fa1f20fc000   1020K -----  /usr/local/java/jdk-1.6-x64/jre/lib/amd64/libjava.so
00007fa1f21fb000     28K rwx--  /usr/local/java/jdk-1.6-x64/jre/lib/amd64/libjava.so
...
00007fa1f34aa000   1576K r-x--  /lib/x86_64-linux-gnu/libc-2.13.so
00007fa1f3634000   2044K -----  /lib/x86_64-linux-gnu/libc-2.13.so
00007fa1f3833000     16K r-x--  /lib/x86_64-linux-gnu/libc-2.13.so
00007fa1f3837000      4K rwx--  /lib/x86_64-linux-gnu/libc-2.13.so
...

簡単な説明のフォーマット:各行で始まり、仮想メモリアドレスを指定するフィールドです。このセグメントのサイズ、パーミッションのソースを指定するフィールドです。この最後の項目のいずれかのファイルまたは"匿名"を示すブロックメモリを割り当てによ .

開始からして

  • のJVMローダー(ieのプログラムが実行時の型 java).これは非常に小さい;すべてでは負荷の共有ライブラリの実JVMコードが格納されています。
  • バ拍のブロックを保持Javaヒープと内部のデータです。これは日JVMので、ヒープが壊れた複数の世代、それぞれが独自のメモリブロックです。このJVMを割り当てて仮想記憶空間のメモリーに基づく -Xmx 値;これによって連続したヒープ.の -Xms 値は内部的に使用されるか、ヒープは"使用中"の場合、プログラムの開始は、トリガーの収集とその限界がまった。
  • メモリマップJARfile、この場合、ファイルを保持する"JDKます。" きメモリ-地図JARへのアクセスできます。ファイル内で非常に効率的に対して持っていないことから始めれます。太陽のJVMではメモリマップすべてのJarをclasspath;アプリケーションの場合はコードのニーズにアクセスは、JARにできるので、メモリマップします。
  • スレッド単位のデータのための二つのスレッド)。の1Mブロックがスレッドのスタック;どうなるかはわからないの4Kブロックです。実際のアプリで数十人がいない場合の何百ものこれらのエントリを繰り返しによるメモリマップを以下に示します.
  • の共有ライブラリの実際のJVMのコードです。があります。
  • には、共有ライブラリはC標準ライブラリ。このほか、シンプルで飽きの来ないところはたくさんのJVM負荷のない厳密に一部のJava.

の共有ライブラリで、特に興味深い:各共有ライブラリは、少なくとも二つのセグメント読み取り専用セグメントを含む図書館のコードを読み取り-書き込みセグメントを含むグローバル毎にプロセスデータのための図書館(どうなるかはわからないが、セグメントのないアクセス権ではありませんが、ある私見でx64Linuxで共通)。の読み取り部分の図書館で共有できるとすべてのプロセスを使用するライブラリー例えば、 libc は、1.5Mの仮想記憶空間を共有できます。

の場合は仮想メモリサイズ重要であるということですか。

仮想メモリを地図を多く含みます。一部のでは読み取り専用であり、あるいは共通のものではないかと触れ(例えば、ほとんどすべての4Gbのヒープこします。こともあり、営業システムは十分にスマートだけに負荷をかいご要望にお応えできるように、仮想メモリサイズが大きく関係ありません。

が仮想メモリサイズが重要だ走32-bit osでは、できるだけ配置す2Gb(または、ある場合には、3Gb)プロセスアドレス空間です。その場合だけを取り扱う希少な資源がトレードオフなどの削減ヒープサイズのためのメモリマップファイルを作成し多くのスレッド)。

でも、64ビットの機械ユビキタスならないと思いますので長期の仮想記憶サイズは全く関係な統計量.

時永サイズの指定が重要であるということですか。

居住者設定のサイズはその部分の仮想記憶空間のメモリーとすることが求められていますアプリです。ごRSSされている重要な部分の合計物理メモリでは時間が始め安心です。ごRSS成するすべての物理メモリ、システム入れ替えでも過去を安心です。

はRSSでも誤解を招く、特に軽くロード機です。経営システムな精神を浸透させるには多くの努力の再生のページで使用されます。あの少し利益を得ように高価なページ故障の場合に触れるページです。その結果、RSSの統計量を含む多くのページんに利用します。

ボトムライン

ませんが入れ替えんのぎの関係とは何かということは、さまざまなメモリの統計が語ります。の点に注意が拡大するRSSを示している可能性があり何らかのメモリリークを引き起こします。

とJavaプログラムで重要注意で何が起こっているのかのヒント.のスペース量の合計の消費が重要なのは、い取ることができるのを削減する。より重要なのは時間の過ごしのガーベッジコレクション、ある部品のヒープが収集します。

アクセスするディスクの家、データベース)はコストが高く、メモリは安いです。できれば貿易のその他います。

他のヒント

が既知の問題Java、glibc>=2.10(Ubuntu>=10.04、RHEL>=6).

の治療は、このenv.変数:

export MALLOC_ARENA_MAX=4

る場合にはTomcatに追加することができますことを TOMCAT_HOME/bin/setenv.sh ファイルです。

のためのDockerを追加するDockerfile

ENV MALLOC_ARENA_MAX=4

あIBM条約設定MALLOC_ARENA_MAX https://www.ibm.com/developerworks/community/blogs/kevgrig/entry/linux_glibc_2_10_rhel_6_malloc_may_show_excessive_virtual_memory_usage?lang=en

このブログという

住民のメモリで知られているクリープと同様の方法により、 メモリリークやメモリの断片化.

ができます。JDKのバグ JDK-8193521"glibc廃棄物のメモリのデフォルトの設定"

検索MALLOC_ARENA_MAX Googleなります。

するためにチューンその他のmallocのオプションの最適化のための低解離の割り当てられたメモリ:

# tune glibc memory allocation, optimize for low fragmentation
# limit the number of arenas
export MALLOC_ARENA_MAX=2
# disable dynamic mmap threshold, see M_MMAP_THRESHOLD in "man mallopt"
export MALLOC_MMAP_THRESHOLD_=131072
export MALLOC_TRIM_THRESHOLD_=131072
export MALLOC_TOP_PAD_=131072
export MALLOC_MMAP_MAX_=65536

量のメモリ割り当てのためのJavaプロセスなのですが、ここではと何を参考にして設定した。また同じような問題をJavaュー/メモリの限られます。走 他の アプリを任意のVMを制限またはシステムな十分量のスワップが割れてしまったりします。この自然の多くの現代アプリなデザインのための利用を持ち、さらにそれらのシステム。

いかのオプションができな範囲JVMのメモリフットプリントこれを減少させうることを示し、仮想メモリフットプリント:

-XX:ReservedCodeCacheSize=32m予約コードキャッシュサイズ(バイト単位)-最大 コードキャッシュサイズです。[Solaris64ビット amd64、x86サーバ:48m;に 1.5.0_06以前は、Solaris64ビットおよびand64:1024m.]

-XX:MaxPermSize=64mのサイズを常設。[5.0新しい:64ビットVmはスケール30%大;1.4 amd64:96m;1.3.1-クライアント:32m.]

また、または-Xmx最大ヒープサイズ)値に限りなく近いの 実際のピークメモリ使用量 のご使用をご検討ください。このデフォルトの動作のJVMが ダブル エディタで開き、ヒープサイズで拡大でのmax.ま32Mヒープやアプリをピークに65M、ヒープが成長32M->64M->128M.

しょうもうこのVMの攻撃的ではないの成長のヒント:

-XX:MinHeapFreeRatio=40最小ヒープの割合後GC を避ける。

また、だからこそリコールからの実験はこの数年前、ネイティブライブラリロードしたり、かなりの影響が最小限界でした。荷java.います。ソケットの付加によ15M振り返ってみると、私が正しい(たいていないのかもしれません).

太陽のJVMが必要なメモリのためのホットスポットで地図でのランタイムの図書館に共有します。

メモリが問題を考えその他のJVMに適した埋め込みを行います。IBMはj9であり、オープンソースの"文をご覧くださる"の使用GNU classpathます。また日のSqueak JVMの渇水リスクを軽減するための支援があります。

ただの思想いてすぐの場所にあるチェックの影響 a ulimit -v オプション.

ではないにも拘わらず、あたかも実際に解決してい限定アドレスで使用可能 すべての が、そのきの動作を確認申請書限定の仮想メモリ。

一方で減少し、ヒープの計測自動制御学会システムの限定されることが可能であるの-XX:MaxHeapFreeRatio可変となります。これは通常の設定を70には最大の割合のヒープ料無料の前に、GCに縮小します。設定で低価されているのかを説明する例のjvisualvmプロファイラが小さいヒープの計測自動制御学会は、通常に使います。

編集:設定小値-XX:MaxHeapFreeRatioていなければなりませんセット-XX:MinHeapFreeRatio 例えば、

java -XX:MinHeapFreeRatio=10 -XX:MaxHeapFreeRatio=25 HelloWorld

EDIT2:加えば、実際のアプリケーショ始まりとも同じようにタスク、デフォルトのパラメータは、10、25パラメータとしてなかった通知を本当の速度差がjava理論的には使用時間の増加は、ヒープの例です。

Default parameters

最後に、最大ヒープは905、ヒープが378

MinHeap 10, MaxHeap 25

最後に、最大ヒープが722使用するヒープは378

こういinpactとして自動的にすべてのリモートデスクトップサーバーは、多くのユーザーが行います。

Sunのjava1.4には以下の引数を制御するメモリサイズ:

-Xmsn 指定の初期サイズ、バイトのメモリ割り当てプールがあります。この値の倍数でなければいけません。1024 以上の1MB.追加の書 またはKを示すキロバイトまたはM を示すメガバイト.デフォルトの 値は2MB.例:

           -Xms6291456
           -Xms6144k
           -Xms6m

-Xmxn 最大サイズを指定し、バイトのメモリ割り当てプールがあります。この値は複数の1024 以上2MB.追加の書 またはKを示すキロバイトまたはM を示すメガバイト.デフォルトの 値は64MB.例:

           -Xmx83886080
           -Xmx81920k
           -Xmx80m

http://java.sun.com/j2se/1.4.2/docs/tooldocs/windows/java.html

Java5 6います。見 http://java.sun.com/javase/technologies/hotspot/vmoptions.jsp

お選びいただけません設定メモリ量が必要とェースを使用してアクセスしますしかし、これは仮想メモリ常駐しないので、それだけでの滞在がも害がなくない場合には実際に使用します。

Alernativelyお試しいただくことが可能であJVMその日は、小さなメモリフットプリントができないおます。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top