私は何のヒントもなく、この問題に長い間悩まされてきました。誰かが助けてくれれば本当に感謝します。
ARM v7 プロセッサを搭載したデバイスで Java アプリケーションを実行しています。Ubuntu がインストールされています。「top」または「free -m」コマンドを使用して見たときのプロセスのメモリ使用量は約 180 MB で、Runtime.freeMemory などのメソッドが教えてくれるものよりもはるかに多くなっています。
これは私がアプリケーションを開始する方法です:
java -Xcheck:jni -XX:MaxPermSize=25m -Xmx65m -XX:ReservedCodeCacheSize=10m -jar MyAPP.jar myconfig.xml
私の知る限り、このプロセスの総メモリ使用量は25 + 65 + 10 = 100 MB
. もう少し多いかもしれません(私が認識していない他の非ヒープスペース)。しかし、それでも違いがこれほど大きくなるとは思いません (80 MB)。
これは、「ランタイム」コマンドがログに表示しているように見えるものです (これらのコマンドを使用して、使用状況に関する情報をデバッグ ログの一部として出力します)。
使用情報: 利用可能なプロセッサ: 2 JVM で使用できる空きメモリ: 8474344、現在のメモリ使用量: 5943576、JVM が使用できる最大メモリ: 66977792
「トップ」からの出力:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
3926 linaro 20 0 266m 188m 3636 S 1.0 21.1 0:37.81 java
「free -m」からの出力:
Java プロセスが実行中の場合:
total used free shared buffers cached
Mem: 893 842 51 0 40 216
-/+ buffers/cache: 585 308
Swap: 0 0 0
プロセスが停止している場合:
total used free shared buffers cached
Mem: 893 656 237 0 40 216
-/+ buffers/cache: 400 493
Swap: 0 0 0
ご覧のとおり、493 - 308 = 185 は、このプロセスのメモリ使用量について "top" が言っていることと一致しています (以前は、このマシンにインストールされている top にバグがあるのではないかと考えていました)。
私もこのプロセスのリモート監視を行いました.約14Mの「コミットされた」ヒープスペースと約20Mの非ヒープを示しています. 少なくともヒープ領域は、「ランタイム」コマンドから取得したものと一致します。そのため、リモート監視ツールでさえ、メモリ使用量は 180M よりはるかに少ないと言っているようです。
最も奇妙な部分は、ラップトップ (MacBook Pro) または標準の Intel ベースの Linux ボックス (ARM ではない) で実行すると、同じ jar ファイルがすべて適切に配置されているように見えることです。プロセスは、私が予想する約 60 MB のスペースしか使用しません。
言及する価値のあるもう 1 つのポイントは、ARM デバイスで使用している Java VM が Oracle の Java SE Embedded バージョンであることです。
このメモリ使用量の不一致について考えている人。このような長い質問をして申し訳ありません:-)。
アップデート:
メモリを消費する Java プロセスのさまざまな部分について調査した後、ネイティブ コード インタラクション (JNI) に焦点を当てました。これは、コマンドのライブ引数からメモリ消費を制限できない唯一の人です。私のプログラムでは、sqlite-jdbc ドライバーを使用してデータベースにアクセスしています。データベースアクセスの部分をコメントしたところ、メモリ使用量が24MBになりました!!! したがって、このメモリの不一致は、この sqlite jdbc アクセスと関係があると推測していますが、それが何であるかはまだわかりません。進展があり次第随時更新していきます。
-サンドディープ