0

私は Java で単純なサーバー アプリケーションを作成しており、現在Apache ベンチマークを使用していくつかのベンチマークを作成しています。

サーバーが使用する常駐メモリは、起動直後で約 40M です。一連の 1000 件のリクエスト (100 件の同時リクエスト) を行います。各シリーズの後、メモリ使用量を再度確認します。結果は私には非常に奇妙に思えます。

ベンチマークの最初の実行中、リクエストの 99% は約 20 ミリ秒で処理され、残りの 1% は約 300 ミリ秒 (!) で処理されます。その間、メモリ使用量は増加します。5 ~ 7 回の実行後、この増加は 120M で止まり、リクエストははるかに高速に実行され始めます (リクエストあたり約 10 ミリ秒)。さらに、リクエストの数を増やしても、時間とメモリの値は変わりません。

なぜこれが起こるのでしょうか?メモリ リークが発生した場合、サーバーはますます多くのリソースを必要とします。これは、事前にヒープサイズを増やすいくつかの適応型 JVM メモリ割り当てメカニズムが原因であるとしか言えません。

4

1 に答える 1

2

ヒープは から始まりXms、指定された limit まで必要に応じて大きくなりますXmx

JVM が「警告」するのに時間がかかるのは正常です。実行時にあらゆる種類の最適化が行われます。

メモリがある程度まで上昇し、その後上昇しなくなった場合は問題ありません。

メモリが無期限に上昇し、プログラムが最終的にスローするOutOfMemoryError場合は、問題があります。

あなたの説明から、前者が真であるように見えるので、メモリリークはありません。

于 2013-04-21T23:21:48.383 に答える