2013-03-26 9 views
7

私は新しい機能を導入する複雑な大規模マルチスレッドアプリケーションを持っています。Javaガベージコレクションとアトミックイベント/ stop gcは、一連の機能呼び出しの中断を一時停止します。

(ベンダー提供のJNI lib経由で)専門ハードウェアの呼び出しを追加しました。しかし、その(非常に速い)関数が呼び出される前に、それに送られたデータ構造を生成するために、あらかじめいくつかの作業が行われています。

しかし、アプリケーションのGCプロファイルは非常に不定期/不良であり、これらの作成ステップのいくつかはGCによって中断されているようです。これは、これらのイベントの最初とハードウェアリソースへのハンドオフとの間に、時間を一定または一定に保つ必要があるためです。

「GC用のsychronise」は、世界のGCが停止している間中止されないようにするための操作ですか? RHL5.5

に64ビット1.7 JDKを使用して

おかげ

+0

だけ明確にするために、あなたは、フルGCのスイープ中に問題を見て、あるいはまた、マイナーGCスイープをしているの? – JustDanyul

+0

短い答え、いいえ。あなたが遭遇している場合は、定期的に何かが間違っている世界を停止する。どのようなgc設定を使用していますか? –

+0

JustSanyul、私はあなたがリアルタイム要件を持っている場合は、完全な大きな問題は、おそらく、(それは<5マイクロ秒を取る必要がある場合。実際に自分自身で操作を書くために一連の操作は、多くの多くのミリ秒を取ることができ1.3microsかかります) – easytiger

答えて

2

は、GCの動作は確定的ではありませんので、あなたが同期を保証することはできません。

3つのオプションは、私の心に来る:

  • あなたは コールごとにデータ構造を移入するために多数のオブジェクトを作成していますか?たぶん、あなたはヒープとGC 自動呼び出しを埋めるのを避けるためにそれらを再使用することができます。
  • あらかじめ割り当てられたメモリを増やしてVMを実行し、gcコールのスペースを確保します。
  • アプリケーションに有害でない場合は、System.gc()を自分で呼び出します。 この呼び出しは単なる提案です(JVMは無視できます)。しかし、私は を試してみましょう。

とにかく、あなたのニーズに最適な選択肢ではなく、Javaの

+0

コール自体Pablo.Noおかげで、アプリケーションのライフサイクルの期間中、同じバイトのバッファを再利用します。 – easytiger

+0

@pabloは、私はあなたが「確実にすることはできません...」ではなく、「缶」を意味すると思いますか? – sharakan

+0

@sharakan Right!固定 –

3

真のリアルタイム言語の実装を使用するように、それはあなたが問題を経験している、完全なガベージコレクション中に、事実である場合には、質問がされていますこれらの完全なガベージコレクションスイープの頻度を下げるためにあなたは何をすることができますか?

まず、これらの完全な掃引を引き起こす状況を分析してください。ヒープスペースが一般的に少なくなっていますか?

また、マイナーな(高速な)ガーベジコレクションでは、オブジェクトが若い世代(edenとsurvivor 1)から次の世代に移動します。生存者2.生存者2に収まらない場合は、資格を取った人に移動されます。十分なスペースがなければ、完全な掃引を開始します。だから、あなたの若い世代が大規模で、長時間実行されているオブジェクトがある程度あれば、これは問題を引き起こす可能性があります。

1日の終わりに、それを分析する必要があります。アプリケーションをプロファイリングして、ガーベジコレクション全体を見ている時期と理由を判断し、アプリケーションを頻繁に使用しないよう調整するか、まれに起こることを「コントロールする」ことができないようにします。

2

完全性のために、リアルタイムJava(RTSJ)を実装するJVMを使用することもできます。リアルタイムJVMで

は、あなたが 任意の GC活動によって中断されることはありませんスレッドであなたの 時間に敏感なタスクを実行することができます。残念ながら、最近では多くのRT JVMが利用可能ではありません。

+0

感謝のためのGCの問題だった私は必要な正確に何thatsのが、悲しいことに、ではないオプション。 – easytiger

2

タスクを使用してJVMのGC動作を修正できない場合、タスクを別のJVMに移動することができます。

プロセス間/マシン間の通信は、最低限のパフォーマンスが向上することを意味しますが、JNI通信を行う別のJVMインスタンスでは、GCを親プロセス内よりも自由にチューニングできるため、 。

関連する問題