1

Java のマルチスレッド エコー サーバー用の単純なコードがあります (受信したものをクライアントに返します)。非ヒープメモリ使用量を含むさまざまなリソースをプロファイリングしています。JVMの非ヒープメモリもJVMの起動時に作成されることを理解していますが、クラスごとの構造を保存し、コールスタック、ネイティブコードによって割り当てられたメモリ(オフヒープキャッシングなど)、メタスペース、およびメモリを含みますJIT コンパイラ (コンパイルされたネイティブ コード) によって使用されます。しかし、主な質問が 2 つあります。

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

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

3) ヒープ メモリについても、上記 2 と同じ違いが見られます。ただし、違いははるかに大きいです。その理由は何ですか?私の推測では、メッセージの保存に必要なバッファー サイズが増加しました。

ここに画像の説明を入力

4

1 に答える 1

1

あなたのサーバーはマルチスレッドであると言いました-受け入れられたソケット接続ごとに新しいスレッドを作成すると仮定します。

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

于 2016-05-10T21:25:02.240 に答える