サイズ4MBの文字列テキストを返すspringRestWebサービスエンドポイントがあります。このエンドポイントの負荷テストを実行すると、ヒープスパイクが常に発生し、最終的にシステムがクラッシュします。私は考えています-リクエストを行うとき、各リクエストはスレッドによって個別に処理されます。私の仮説は次のとおりです。文字列はグローバル静的変数に保存されるため、各スレッドは4MBのコピーを取得し、約3000リクエスト後、ヒープはすべて消費され、システムはクラッシュします。これは、各4MBを取得する3000スレッドが約12GBであるため、システムがクラッシュするためです。メモリが不足します。しかし、これは私の仮説です。
私の質問:リクエストを処理する各スレッドがその仕事を終えた後、Tomcatはメモリを再利用しませんか?これはGC(ガベージコレクション)と関係がありますか?リクエストのライフサイクルでは、リクエストが来ると、スレッドが作成されます(そのリクエストごとに)スレッドは応答の独自のコピーを取得しますか、それとも単に応答を参照しますか?その巨大な文字列応答が各スレッドにコピーされる場合、それがヒープスパイクが表示されている理由である可能性があります。応答がクライアントに返されるとき、tomcatはどのようにしてそのスレッドのリソースを再利用しますか?いつそれをしますか?GCに関連するリクエストスレッドを要求していますか?
私が観察したもう1つの側面は、socketWrite0()メソッドの遅延です。これには応答時間の70〜95%がかかります。ボトルネックだと思います。では、要求応答のフローでは、誰がソケットに書き込みますか?スレッド?または、スレッドがTomcatに応答を渡し、Tomcatがそれを書き込みますか?
メモリスパイクと巨大な文字列応答に関連するヒントや側面を教えていただければ幸いです。みんなありがとう!
薔薇