これは、Javaのメモリ管理の仕組みだけである - それは、基本的にはGCが必要とされる前にアプリケーションが終了することを期待して必要になるまでガベージコレクションを遅らせます。
それは多くの場合、オプト限界までOS、アップからより多くのメモリを割り当てることになるので、どちらかによって与えられる-Xmx
か、OS /総RAM限界によって、唯一それが主要なガベージコレクタの実行を実行します。これらの実験は、いくつかのメモリを解放すると、アプリケーションは再び限界に遭遇するまで、いくつかのより多くの時間のために実行されます。
アプリケーションが徐々に多くのメモリを必要とする場合、それがヒットした後に何が起こるかメモリ制限は、主要なGCの実行は、(必要なメモリが増加すると、メモリはGC減少によってクリア)もっともっと頻繁に取得し、GCの実行が長くなることです。ある時点で、VMは、アプリケーションを実行しているよりも、GCで多くの時間を費やして開始することができます。
このように、実際のアプリケーションが原因GCに費やされているほぼすべてのCPU時間にほとんど実際の実行時間を取得しながら、Javaプロセスは、(おそらく「永遠に」)長時間実行され、ほぼすべての使用可能なメモリを消費する可能性があります。Javaはこの状況を検出し、投げることjava.lang.OutOfMemoryError
のメッセージでGC Overhead Limit Exceeded
はなく、常にしません。
アプリだけでメモリの使用を最適化し、又は本質的にメモリの外に実際にされたかどうかを診断する場合は、VMがGCに費やし、そしてどのような傾向があるどのくらいの時間を知る必要があります。いくつかの可能な方法:
- JConsoleのまたはVisualVMのと接続する(両方がJDKの一部である)とGC実行(間隔及び持続時間)を確認
- デフォルトのGCは、GCは、それはほとんどそれ以上のプロセッサ/コア上で実行され、CPUの負荷がAの100%以上になります実行するので中に、マルチスレッドである-あなたのJavaアプリケーションは、シングルhreadedであればもっと簡単な方法は、CPUの負荷を観察することです単一コア(UNIXで> 100%
top
)、シングルスレッドアプリケーションは、単一のコアの100%に負荷を生じています。