package glug.gui.gc; import static java.awt.Color.BLACK; import static java.lang.Math.round; import gchisto.gcactivity.GCActivity; import gchisto.gcactivity.GCActivitySet; import gchisto.gctrace.GCTrace; import glug.gui.TimelineComponent; import glug.gui.UITimeScale; import glug.gui.timelinecursor.TimelineCursor; import glug.model.ThreadedSystem; import java.awt.Color; import java.awt.Graphics2D; import java.awt.Rectangle; import org.joda.time.Duration; import org.joda.time.Instant; import org.joda.time.Interval; public class GCTraceView extends TimelineComponent { private static final long serialVersionUID = 1L; private final GCTrace gcTrace; private GCActivitySet fullGCActivitySet; private final ThreadedSystem threadedSystem; public GCTraceView(GCTrace gcTrace, UITimeScale uiTimeScale, ThreadedSystem threadedSystem, TimelineCursor timelineCursor) { super(uiTimeScale, timelineCursor); this.gcTrace = gcTrace; this.threadedSystem = threadedSystem; fullGCActivitySet = gcTrace.get(indexOfActivityWithName("Full GC")); } @Override public boolean containsData() { return true; } @Override protected int getPreferredHeight() { return 100; } @Override protected void paintPopulatedComponent(Graphics2D graphics2D) { Rectangle clipBounds = graphics2D.getClipBounds(); Interval visibleInterval = uiTimeScale.viewToModel(clipBounds); Instant startOfVisibleInterval = visibleInterval.getStart().toInstant(); Instant jvmRestartPrecedingStartOfVisibleInterval = threadedSystem.uptime().startPreceding(startOfVisibleInterval); graphics2D.setColor(BLACK); for (GCActivity activity : gcTrace.getAllGCActivities()) { Instant activityStartInstant = jvmRestartPrecedingStartOfVisibleInterval.plus(round(activity.getStartSec()*1000)); Duration activityDuration = new Duration(round(activity.getDurationSec()*1000)); Interval activityInterval = new Interval(activityStartInstant,activityDuration); Interval visibleActivityInterval = visibleInterval.overlap(activityInterval); if (visibleActivityInterval!=null) { float colVal = (float) (100-activity.getOverheadPerc()); graphics2D.setColor(new Color(colVal,colVal,colVal)); graphics2D.fillRect( uiTimeScale.modelToView(visibleActivityInterval.getStart().toInstant()), 0, uiTimeScale.modelDurationToViewPixels(visibleActivityInterval.toDuration()), 100); } } } private int indexOfActivityWithName(String name) { return gcTrace.getGCActivityNames().indexOf(name); } }