2016-11-10 12 views
1

私はJavaプロセスを実行しています。これは、jconsoleごとにヒープメモリが150MBと表示されますが、同じプロセスでは、ubuntuのおよそのシステムモニタです。 470 MB。また、クラスパスのjarファイルのサイズを調べると、約200 MBになります。Javaで、ヒープメモリとシステムメモリ

クラスパスに存在するすべてのjarがその特定のプロセスのためにJVMに読み込まれると考えています。

ご理解いただけますようお願いいたします。 ...私は何かに行方不明ですか?

+0

これははるかに複雑です。 –

+0

JARはヒープにロードされません。 –

+0

上記の質問の更新 – Rajas

答えて

1

Ubuntuのシステムマネージャは、JRE(Java Runtime Environment)が占めるメモリを完全に表示します。 JREには、スタックメモリ(ネイティブ& Javaスタック)、コードメモリ(Javaクラスとコードが存在する)、ヒープメモリなどの他のメモリが含まれています。したがって、JConsoleがメモリマネージャによって表示されるものより常に少なくなるヒープメモリ。さらに、JREは、OSとは独立した独自のメモリを管理します。したがって、すでにOSからより多くのメモリを取得している可能性がありますが、あなたのプログラムは現在のところメモリを必要としません。したがって、次回のプログラムではより多くのメモリが必要になるたびに、より多くのメモリを要求するためにOSに行く必要はありません。 OSからより多くのメモリを要求するシステムコールは高価です。

あなたのJAR読み込みの質問に来ています。クラスパスに存在するすべてのjarファイルは、必ずしもJREによって読み込まれるとは限りません。彼らは要求に応じてロードされます。したがって、クラスパスには100個のJarファイルがありますが、1個のJarファイルには2つのクラスしかロードされません。したがって、これら2つのクラスはメモリにロードされます。

さらに洗練されたメモリ解析を行うために、いくつかのプラグインに付属するJVisualVMを使用して、プログラム内のメモリを分析することをお勧めします。

+0

(プロセスがイベントトリガーされている)これに加えて、私のプロセスがアイドル状態(つまり、イベントなし)で "システムモニター"のシステムメモリが増加する。なぜ理解できないのですか? – Rajas

関連する問題