非常に高密度のトラフィックを大量に処理するJavaサーバーに取り組んでいます。サーバーはクライアント(多くの場合、数メガバイト)からのパケットを受け入れ、他のクライアントに転送します。サーバーは、着信/発信パケットを明示的に保存することはありません。それでも、サーバーは継続的にOutOfMemoryException
例外に遭遇します。
System.gc()
サーバーのメッセージパッシングコンポーネントに、メモリが解放されることを期待して追加しました。さらに、JVMのヒープサイズをギガバイトに設定しました。私はまだ同じくらい多くの例外を受け取っています。
だから私の質問はこれです:メガバイトのメッセージが無期限にキューに入れられていないことをどのように確認できますか(必要ではないにもかかわらず)?これらのオブジェクトで「削除」を呼び出して、ヒープスペースを使用していないことを保証する方法はありますか?
try
{
while (true)
{
int r = generator.nextInt(100);//generate a random number between 0 and 100
Object o =readFromServer.readObject();
sum++;
// if the random number is larger than the drop rate, send the object to client, else
//it will be dropped
if (r > dropRate)
{
writeToClient.writeObject(o);
writeToClient.flush();
numOfSend++;
System.out.printf("No. %d send\n",sum);
}//if
}//while
}//try