Linux プラットフォームで JBoss アプリケーションを実行していますが、次のようなトップ出力があります (実際には正確なデータではありません)。
PID USER PR NI VIRT RES SHR S %CPU %MEM CODE DATA TIME+ COMMAND
1379 root 16 0 9.7g 1.6g 1980 S 0.7 1.3 36 9.7g 0:11.03 java
物理メモリは合計で 1.6g、データ部分は 9.7g です。実際のヒープ サイズは、JVM で構成されているとおり、約 128m です。質問は、Java アプリケーションの DATA 部分には何が格納されているのかということです。何か手がかりはありますか。また、どのように最適化すればよいでしょうか。
ありがとう、エムレ
答え1
DATA
アプリケーションによって割り当てられたメモリを意味します。brk(2)
つまり、データ セグメントを拡張します。
Java には、データ セグメントに格納されるさまざまなものがあります。
- ヒープ
- ネイティブランタイム層によって割り当てられたメモリ(
native
キーワードを使用するコード) - JNI/JNA を使用して Java からロードする DLL/共有ライブラリによって割り当てられたメモリ
- JIT によってバイトコードがロード、解釈、コンパイルされるメモリ (コード キャッシュ)
- GC やその他のランタイムサポートコードで使用されるメモリ構造
- スタック
プログラムに 128MB のヒープを割り当てると、Java はヒープの一部ではないヒープ管理用の構造もいくつか作成するため、それ以上の領域が割り当てられることに注意してください。つまり、128MB は、Java オブジェクトを割り当てることができる領域が 128MB あることを意味します。
答え2
これは、実行可能コード以外の用途に割り当てられた物理メモリの量で、「データ常駐セット」サイズまたは DRS とも呼ばれます。通常、すべての列を詳細に説明したマニュアル ページを参照できます。マニュアル ページを取得するには、 と入力しますman top
。