bool Statistics::formatData(StatisticsSerializer &ss, uint64_t timestamp) { int64_t total, longest; gcDuration(&total, &longest); int64_t sccTotal, sccLongest; sccDurations(&sccTotal, &sccLongest); double mmu20 = computeMMU(20 * PRMJ_USEC_PER_MSEC); double mmu50 = computeMMU(50 * PRMJ_USEC_PER_MSEC); ss.beginObject(nullptr); if (ss.isJSON()) ss.appendNumber("Timestamp", "%llu", "", (unsigned long long)timestamp); if (slices.length() > 1 || ss.isJSON()) ss.appendDecimal("Max Pause", "ms", t(longest)); else ss.appendString("Reason", ExplainReason(slices[0].reason)); ss.appendDecimal("Total Time", "ms", t(total)); ss.appendNumber("Zones Collected", "%d", "", zoneStats.collectedZoneCount); ss.appendNumber("Total Zones", "%d", "", zoneStats.zoneCount); ss.appendNumber("Total Compartments", "%d", "", zoneStats.compartmentCount); ss.appendNumber("Minor GCs", "%d", "", counts[STAT_MINOR_GC]); ss.appendNumber("Store Buffer Overflows", "%d", "", counts[STAT_STOREBUFFER_OVERFLOW]); ss.appendNumber("MMU (20ms)", "%d", "%", int(mmu20 * 100)); ss.appendNumber("MMU (50ms)", "%d", "%", int(mmu50 * 100)); ss.appendDecimal("SCC Sweep Total", "ms", t(sccTotal)); ss.appendDecimal("SCC Sweep Max Pause", "ms", t(sccLongest)); if (nonincrementalReason || ss.isJSON()) { ss.appendString("Nonincremental Reason", nonincrementalReason ? nonincrementalReason : "none"); } ss.appendNumber("Allocated", "%u", "MB", unsigned(preBytes / 1024 / 1024)); ss.appendNumber("+Chunks", "%d", "", counts[STAT_NEW_CHUNK]); ss.appendNumber("-Chunks", "%d", "", counts[STAT_DESTROY_CHUNK]); ss.endLine(); if (slices.length() > 1 || ss.isJSON()) { ss.beginArray("Slices"); for (size_t i = 0; i < slices.length(); i++) { int64_t width = slices[i].duration(); if (i != 0 && i != slices.length() - 1 && width < SLICE_MIN_REPORT_TIME && !slices[i].resetReason && !ss.isJSON()) { continue; } ss.beginObject(nullptr); ss.extra(" "); ss.appendNumber("Slice", "%d", "", i); ss.appendDecimal("Pause", "", t(width)); ss.extra(" ("); ss.appendDecimal("When", "ms", t(slices[i].start - slices[0].start)); ss.appendString("Reason", ExplainReason(slices[i].reason)); if (ss.isJSON()) { ss.appendDecimal("Page Faults", "", double(slices[i].endFaults - slices[i].startFaults)); ss.appendNumber("Start Timestamp", "%llu", "", (unsigned long long)slices[i].start); ss.appendNumber("End Timestamp", "%llu", "", (unsigned long long)slices[i].end); } if (slices[i].resetReason) ss.appendString("Reset", slices[i].resetReason); ss.extra("): "); FormatPhaseTimes(ss, "Times", slices[i].phaseTimes); ss.endLine(); ss.endObject(); } ss.endArray(); } ss.extra(" Totals: "); FormatPhaseTimes(ss, "Totals", phaseTimes); ss.endObject(); return !ss.isOOM(); }
bool Statistics::formatData(StatisticsSerializer &ss, uint64_t timestamp) { int64_t total = 0, longest = 0; for (SliceData *slice = slices.begin(); slice != slices.end(); slice++) { total += slice->duration(); if (slice->duration() > longest) longest = slice->duration(); } double mmu20 = computeMMU(20 * PRMJ_USEC_PER_MSEC); double mmu50 = computeMMU(50 * PRMJ_USEC_PER_MSEC); ss.beginObject(NULL); if (ss.isJSON()) ss.appendNumber("Timestamp", "%llu", "", (unsigned long long)timestamp); ss.appendDecimal("Total Time", "ms", t(total)); ss.appendNumber("Compartments Collected", "%d", "", collectedCount); ss.appendNumber("Total Compartments", "%d", "", compartmentCount); ss.appendNumber("MMU (20ms)", "%d", "%", int(mmu20 * 100)); ss.appendNumber("MMU (50ms)", "%d", "%", int(mmu50 * 100)); if (slices.length() > 1 || ss.isJSON()) ss.appendDecimal("Max Pause", "ms", t(longest)); else ss.appendString("Reason", ExplainReason(slices[0].reason)); if (nonincrementalReason || ss.isJSON()) { ss.appendString("Nonincremental Reason", nonincrementalReason ? nonincrementalReason : "none"); } ss.appendNumber("Allocated", "%u", "MB", unsigned(preBytes / 1024 / 1024)); ss.appendNumber("+Chunks", "%d", "", counts[STAT_NEW_CHUNK]); ss.appendNumber("-Chunks", "%d", "", counts[STAT_DESTROY_CHUNK]); ss.endLine(); if (slices.length() > 1 || ss.isJSON()) { ss.beginArray("Slices"); for (size_t i = 0; i < slices.length(); i++) { int64_t width = slices[i].duration(); if (i != 0 && i != slices.length() - 1 && width < SLICE_MIN_REPORT_TIME && !slices[i].resetReason && !ss.isJSON()) { continue; } ss.beginObject(NULL); ss.extra(" "); ss.appendNumber("Slice", "%d", "", i); ss.appendDecimal("Pause", "", t(width)); ss.extra(" ("); ss.appendDecimal("When", "ms", t(slices[i].end - slices[0].start)); ss.appendString("Reason", ExplainReason(slices[i].reason)); if (slices[i].resetReason) ss.appendString("Reset", slices[i].resetReason); ss.extra("): "); FormatPhaseTimes(ss, "Times", slices[i].phaseTimes); if (ss.isJSON()) FormatPhaseFaults(ss, "Page Faults", slices[i].phaseFaults); ss.endLine(); ss.endObject(); } ss.endArray(); } ss.extra(" Totals: "); FormatPhaseTimes(ss, "Totals", phaseTimes); if (ss.isJSON()) FormatPhaseFaults(ss, "Total Page Faults", phaseFaults); ss.endObject(); return !ss.isOOM(); }