in spectator-ext-gc/src/main/java/com/netflix/spectator/gc/GcLogger.java [194:241]
private void updateMetrics(String name, GcInfo info) {
final Map<String, MemoryUsage> before = info.getMemoryUsageBeforeGc();
final Map<String, MemoryUsage> after = info.getMemoryUsageAfterGc();
if (oldGenPoolName != null) {
final long oldBefore = before.get(oldGenPoolName).getUsed();
final long oldAfter = after.get(oldGenPoolName).getUsed();
final long delta = oldAfter - oldBefore;
if (delta > 0L) {
PROMOTION_RATE.increment(delta);
}
// Shenandoah doesn't report accurate pool sizes for pauses, all numbers are 0. Ignore
// those updates.
//
// Some GCs such as G1 can reduce the old gen size as part of a minor GC. To track the
// live data size we record the value if we see a reduction in the old gen heap size or
// after a major GC.
if (oldAfter > 0L && (oldAfter < oldBefore || HelperFunctions.isOldGcType(name))) {
LIVE_DATA_SIZE.set(oldAfter);
final long oldMaxAfter = after.get(oldGenPoolName).getMax();
MAX_DATA_SIZE.set(oldMaxAfter);
}
}
if (survivorPoolName != null) {
final long survivorBefore = before.get(survivorPoolName).getUsed();
final long survivorAfter = after.get(survivorPoolName).getUsed();
final long delta = survivorAfter - survivorBefore;
if (delta > 0L) {
SURVIVOR_RATE.increment(delta);
}
}
if (youngGenPoolName != null) {
final long youngBefore = before.get(youngGenPoolName).getUsed();
final long youngAfter = after.get(youngGenPoolName).getUsed();
// Shenandoah doesn't report accurate pool sizes for pauses, all numbers are 0. Ignore
// those updates.
if (youngBefore > 0L) {
final long delta = youngBefore - youngGenSizeAfter;
youngGenSizeAfter = youngAfter;
if (delta > 0L) {
ALLOCATION_RATE.increment(delta);
}
}
}
}