2016-05-10 28 views
1

私はJavaでマルチスレッドエコーサーバーの簡単なコードを持っています(クライアントに返されたものを返します)。私はヒープ以外のメモリ使用を含む様々なリソースをプロファイリングしています。私は、JVMの非ヒープ・メモリもJVMの起動時に作成されると理解していますが、クラスごとの構造を格納し、コール・スタック、オフ・ヒープ・キャッシングのネイティブ・コードによって割り当てられたメモリー、 JITコンパイラ(コンパイルされたネイティブコード)によって使用されます。しかし、私は2つの主な質問があります:Javaプログラムとしての非ヒープメモリ使用量のわずかな差異

1)ヒープ以外のメモリ使用量は、時間の経過とともにわずかに増加します。この増加はわずかですが、メモリ使用量がわずかに増加する原因は何ですか?

2)非ヒープメモリの使用率は、通信するクライアントの数が増加するにつれてほぼ同じですが、大幅に拡大すると同様に、クライアントの数が増えるにつれて少し増えます。それの主な理由は何ですか?私はそれが新しいスレッドに必要なスペースが増えたことが原因だろうと推測していましたが、このわずかな増加を引き起こすためにこれらのスレッドは何をしていますか?

3)ヒープメモリについても上記2と同じ違いがあります。しかし、その違いははるかに大きいです。その理由は何ですか?私の推測では、メッセージを格納するために必要なバッファサイズが増えました。

enter image description here

答えて

1

ご自分のサーバがマルチスレッドであることを言った - 私はあなたが各受け入れソケット接続のための新しいスレッドを作成することを前提としています。

JVMでは、各スレッドは「スタック」と呼ばれるいくつかのメモリを消費し、アクティブな実行フレームをすべて格納します。 64ビットJVMのデフォルトのスタックサイズは1024Kです。私はこのヒープ以外のメモリのグラフで、ソケットスレッド用に割り当てられたスタックを見ることができると思います。

+0

私は参照してください。ありがとう。単一のクライアントがより高いレートでメッセージを送信した場合、メモリ使用量が増加する理由は何ですか?サーバー側には常に1つのスレッドしか存在しません。 –

+0

ところで、これらのスタックはヒープ以外のメモリに格納されていますか?違いはデフォルトの1024 KBよりはるかに小さいためです。実際にヒープメモリの場合、その差はほとんどこのサイズです! –

+0

詳細については、この質問を参照してください。http://stackoverflow.com/questions/6785754/jvm-process-vs-jvm-heap-memory-usage –

関連する問題