0

Javaを使用してソケットサーバーを構築しています。

サーバーの実行中に発生している多くのアクションをログに記録しており、各ログ行の横に、次を使用して JVM の現在の空きメモリを書き込んでいます。

Runtime.getRuntime().freeMemory()

ログを見るとわかるように、空きメモリがあまりありません (約 14 ~ 15 MB)。

root アクセス権を持つ freeBSD サーバーでこのソケット サーバーを実行します。

JVM に割り当てられたメモリを調整したいのですが、その方法がよくわかりません。また、freeBSD と Linux 全般についてはまったくの初心者です。

4

1 に答える 1

4

Javaでのメモリ(特にガベージコレクション)がどのように機能するかについての仮定には欠陥があります。

Runtime.getRuntime().freeMemory()

この呼び出しは、JVMヒープ上の「空き」メモリのみを示します。これは、およびコマンドライン引数でに割り当てられます。または、アプリサーバーを使用している場合は、いくつかの起動スクリプトで。-Xms-Xmxjava

なぜあなたがやろうとしているのは時間の無駄です

なぜこの質問に対するこの答えを見てください!

Javaのガベージコレクター(空きメモリを制御する)は、可能な限り多くのメモリを解放するように調整されていません。パフォーマンスと応答性のバランスが取れるように調整されています。それはオンデマンドでメモリを解放するだけであり、最大の空きメモリを持つことに利点はなく、そうしようとすることには多くの欠点があります。

これにより、参照されなくなったオブジェクトは、それらが占有するメモリが実際に必要になるまで、「メモリの使用」を回避します。これらを時期尚早に削除すると、実行中のコードのパフォーマンスが低下するため、これは実際には最適です。

メモリを解放する必要がある場合にのみ、それらを非常に迅速に削除することが、ガベージコレクターの目標であり、可能な限り多くのメモリを解放しようとはしません。

正しく実装されたJavaプログラムを呼び出す必要はありません。System.gc()

Java HotSpotには、3つの異なるコレクターが含まれています。シリアルコレクションはGCにシングルスレッドを使用し、データセットが100Mバイト未満のシングルプロセッサマシンに最適です。Parallelは、マイナーコレクションを並行して実行します。マルチスレッドまたはマルチプロセッサハードウェアで実行される中規模から大規模のデータセットに最適です。コンカレントコレクターは、スループットよりも応答時間が重要な場合にガベージコレクションの一時停止が短くなるように最適化されています。このモードは通常、シングルコアマシンでは何のメリットもありません。

OutOfMemoryExceptionsを回避するには

  1. サーバーで可能な限り大きな設定-Xmxに設定します。-Xms公称と思われるメモリブロックの最小サイズに設定します。小さすぎると大きすぎるよりも悪いです。

  2. 参照を漏らさないでください。

于 2012-05-17T15:56:38.453 に答える