Linux MintでJavaプログラムのメモリ消費量を分析しました。私はtop
メモリ統計(プログラムで使用されているメモリとtotal_mem_usedやmem_freeなどのシステム全体の指標)を取得するために使用しました。結果は素晴らしいです。
- 「使用済み物理メモリ」(
RAM_USE_DELTA
チャート内)は増加し、「使用可能な物理メモリ」(チャートから回復)RAM_FREE_DELTA
はRES(チャート内)の増加とP_RSS
同じ量だけ減少します。これが私が期待したものです。 - DATA(
P_DATA
チャートの)フィールド(top
一番上の「実行コード以外の専用物理メモリの量」として説明されています)は、RESより150 MB高いです。 - スワップ(
SWAP_USE_DELTA
チャート内)は常に0です。 - SHR(共有メモリ、
P_SHR
チャート)は15MB未満です。
問題は、前述の150MBが正確に何であるかです。仮想(予約されているが割り当てられていない)スタックはありますか?メモリマッピングファイル?前に書いたようにRES
〜RAM_USED_DELTA
だから利用可能なメモリ量が150MBほど減らなくて仮想メモリを意味するかもしれませんが、メモリ表示が常駐セットと仮想メモリ量の合計であればおかしいようですが...
(この図で描かれている線は、プログラム*_DELTA
の先頭に基づいています。つまり、赤が始まる左側の近くにありますP_RSS
。)
ベストアンサー1
DATA フィールドは、実行不可能なコード、つまりデータに割り当てられるプロセスの仮想メモリです。これには、静的データ、スタック、および動的に割り当てられたメモリが含まれ、CODEフィールドとともに仮想メモリ全体に含まれます。 RESidentサイズは、RAM内の仮想メモリの実際の量です。これは、部分コード、部分データ、およびその他の部分(メモリマッピングファイルなど)で構成されます。
VIRT、CODE、DATA、RESの間には直接的な関係がないことがわかります。 CODEはコンパイラによって提供されます。 VIRTとDATAはプロセス(、など)によって制御されます。malloc()
RES部分はオペレーティングシステムによって制御されます。free()
mmap()