1

子プロセスが定期的に親に ping を実行して親がまだ生きていることを伝えるハートビート メカニズムを実装したいと考えています。この方法で、threadPool の scheduleWithFixedDelay メソッドを使用して ping タスクを実装します。

   pingService.scheduleWithFixedDelay(new PingGroomServer(umbilical,
          taskId), 0, pingPeriod, TimeUnit.MILLISECONDS);  

親プロセスへのRPCクライアントは臍帯ですか?

固定遅延で scheduleWithFixedDelay をスケジュールできますか? Stop-The-World GC 中に ping スレッドは停止しますか? 実際、6 * pingPeriod ミリ秒待ってもまだハートビートを逃しています。

4

2 に答える 2

3

そのため、アプリケーションでより決定論的なランタイム (Gc の一時停止、スレッドのスケジューリングなど) を行うには、いくつかの選択肢があります。

  1. 予測可能に、リアルタイムに。1 つの方法は、RTSJ に基づくリアルタイム Java 実装、または http://fiji-systems.com/ http://www.aicas.com/ http://www-03.ibm などの他のリアルタイム Java 実装に向かうことです。 com/linux/realtime.html
  2. 低レイテンシーを実現し、ストップ・ザ・ワールド GC は不要です。もう 1 つの方法は、低遅延の同時コレクターを使用する Azul システムの Zing JVM のように、世界を止めるガベージ コレクションの一時停止なしで Java 実装を使用することです。 http://www.azulsystems.com/solutions/low-latency/overview

上記の選択は小さなアプリケーションにとってかなり大きなステップになる可能性があるため、「従来の」Java 実装で実行できることがあります。

そのため、Oracle/OpenJDK JVM で短い GC 一時停止が必要な場合は、いくつかの経験則があります。

  • ハードウェア - これは最も重要です。高速マルチスレッド CPU と高速メモリ モジュールを備えた SMP システムが必要です。交換は避けてください。したがって、ハードウェアが高速であるほど、ガベージ コレクターの実行速度も速くなります。
  • マルチスレッド ガベージ コレクタを使用します。Oracle JVM を使用している場合は、G1 または parallelGC (別名スループット コレクター) を使用します。
  • 小さなヒープを使用してください。ヒープが大きいほど、ガベージ コレクターが処理する必要があるスペースが大きくなります。
  • メモリ (ヒープ) のエルゴノミクスを調整します。フル ガベージ コレクションを回避するために、メモリのエルゴノミクスを微調整し、オブジェクトが若い世代に収集されるようにします (古い世代には昇格されません)。

同様の質問に対する別の回答: 小さなヒープでのフル GC に 5 秒かかるのはなぜですか?

GC エルゴノミクスの詳細については、 http ://www.oracle.com/technetwork/java/javase/gc-tuning-6-140523.html を参照してください。

于 2013-09-13T06:14:00.317 に答える
1

はい、stop-the-world はまさにその通りです。特にガベージ コレクターに関与していないヒープ上のオブジェクトにアクセスするすべてのスレッドが停止されます。

Java でハートビートが必要な場合は、そのコードだけを実行している別の VM にファームアウトして、VM の一時停止がそれほど長くならないようにすることをお勧めします。または、ミリ秒のタイミングに依存しないでください。デスクトップ OS のプロセス間でそのレベルのスケジューリングを想定することはできません。

于 2013-09-13T02:09:28.407 に答える