3

私の GC ログのほとんどの行は次のようになります。

203.558: [GC 326391K->324672K(4192192K)、0.0452610秒]

括弧内のサイズは「コミットされたヒープ」、または (おおよその) OS から見たプロセスのサイズです。その前の 2 つの数字 (「a->b」) は、GC 前後のヒープ使用量を示しています。

現在、定期的に次のような行が表示されます。

42381.926: [GC 10996274K(12565888K)、0.0651560秒]

これらはヒープの使用量が GC によって変更されなかったことを意味しますか、それとも別のメッセージですか? Oracle の GC チューニング チュートリアルと、特に GC 出力に関する別のページを見ましたが、このタイプのメッセージの説明が見つかりませんでした。

Sun JVM (1.6.0.25)、Concurrent Collector ( -XX:+UseConcMarkSweepGC) を使用しており、出力関連の起動オプションは のみです-Xloggc:gc.log

4

3 に答える 3

1

JDK 1.6 update 23 (私が見つけた最新の 1.6 バージョン) のソース コードで "secs" を検索し、GC コード フォルダーから正規表現 "[^"]*->[^"]*" を検索しました。手がかりが見つかることを願って。OpenJDK 1.7 コードも検索しました。次に、HotSpot フォルダー全体で "[^"]*->[^"]*"?.*secs を検索してみました。それでも、私が見つけた GC ロギングの唯一の行は、あなたが見ているものにリモートで関連しているようです

gclog_or_tty->print("[%s-concurrent-%s: %3.3f/%3.3f secs]",
             _collector->cmsGen()->short_name(),
             _phase, _collector->timerValue(), _wallclock.seconds());

これは、concurrentMarkSweepGeneration.cpp にあります。これまで見てきたフォーマットとはかけ離れています。よく検索していないか、アップデート 23 とアップデート 25 の間で GC ロギングに関して何かが変更されました。

どこを見ればよいか、何を検索すればよいかについて明確な考えをお持ちの方がいらっしゃいましたら、喜んでお教えいたします。

EDIT:待って、concurrentMarkSweepGeneration.cppの827行目から始まる何かを見つけました:

void ConcurrentMarkSweepGeneration::printOccupancy(const char *s) {
  GenCollectedHeap* gch = GenCollectedHeap::heap();
  if (PrintGCDetails) {
    if (Verbose) {
      gclog_or_tty->print(" [%d %s-%s: "SIZE_FORMAT"("SIZE_FORMAT")]",
        level(), short_name(), s, used(), capacity());
    } else {
      gclog_or_tty->print(" [%d %s-%s: "SIZE_FORMAT"K("SIZE_FORMAT"K)]",
        level(), short_name(), s, used() / K, capacity() / K);
    }
  }
  if (Verbose) {
    gclog_or_tty->print(" "SIZE_FORMAT"("SIZE_FORMAT")",
              gch->used(), gch->capacity());
  } else {
    gclog_or_tty->print(" "SIZE_FORMAT"K("SIZE_FORMAT"K)",
              gch->used() / K, gch->capacity() / K);
  }
}

そして、その関数はここでのみ呼び出されています:

void CMSCollector::do_CMS_operation(CMS_op_type op) {
  gclog_or_tty->date_stamp(PrintGC && PrintGCDateStamps);
  TraceCPUTime tcpu(PrintGCDetails, true, gclog_or_tty);
  TraceTime t("GC", PrintGC, !PrintGCDetails, gclog_or_tty);
  TraceCollectorStats tcs(counters());

  switch (op) {
    case CMS_op_checkpointRootsInitial: {
      checkpointRootsInitial(true);       // asynch
      if (PrintGC) {
        _cmsGen->printOccupancy("initial-mark");
      }
      break;
    }
    case CMS_op_checkpointRootsFinal: {
      checkpointRootsFinal(true,    // asynch
                           false,   // !clear_all_soft_refs
                           false);  // !init_mark_was_synchronous
      if (PrintGC) {
        _cmsGen->printOccupancy("remark");
      }
      break;
    }
    default:
      fatal("No such CMS_op");
  }
}

それは確かにあなたが得ているもののように見えます. 私はこのコードを解釈するのが得意ではありませんが、あなたが見ているのは、現在のヒープ使用量とそれに続く括弧内のコミットされたヒープ サイズを示す単なるログ行だと思います。基本的に同じ情報ですが、ガベージ コレクションの前に使用されていません。

于 2011-11-01T11:50:50.760 に答える
0

gc-loogingに関連するすべてのjvmパラメーターをリストできますか?

あなたの出力を見て、私はあなたが使っているとは思わない

-verbose:gc -XX:+ PrintGCTimeStamps -XX:+ PrintGCDetails

また、チェックしてください

TomcatGCログステートメントの説明

Javaガベージコレクションログメッセージ

于 2011-11-01T11:55:35.457 に答える
0

この行は、CMS ( ) および ParNew ( )TraceTimeから呼び出される in timer.cppによって開始されると思います。このコードはソースのようですconcurrentMarkSweepGeneration.cpp do_CMS_operationparNewGeneration.cpp collect

void ConcurrentMarkSweepGeneration::printOccupancy(const char *s) {
    GenCollectedHeap* gch = GenCollectedHeap::heap();
    if (PrintGCDetails) {
      if (Verbose) {
        gclog_or_tty->print(" [%d %s-%s: "SIZE_FORMAT"("SIZE_FORMAT")]",
          level(), short_name(), s, used(), capacity());
    } else {
        gclog_or_tty->print(" [%d %s-%s: "SIZE_FORMAT"K("SIZE_FORMAT"K)]",
          level(), short_name(), s, used() / K, capacity() / K);
      }
    }
    if (Verbose) {
      gclog_or_tty->print(" "SIZE_FORMAT"("SIZE_FORMAT")",
                gch->used(), gch->capacity());
    } else {
      gclog_or_tty->print(" "SIZE_FORMAT"K("SIZE_FORMAT"K)",
              gch->used() / K, gch->capacity() / K);
    }
}

したがって、これは、ヒープの合計占有率 (すべての世代の合計) と、現在の GC 操作中に経過した時間のステートメントです。印刷された時間は、タイマーがインスタンス化されたときに開始され、破棄されたときに停止/印刷されるos::elapsed_counterため、実時間のように見えます。gettimeofdayTraceTime

必要に応じて、追加verbose:gcして詳細情報を取得することをお勧めします。

于 2011-11-01T12:25:51.467 に答える