From 4dcb0e317d6a676dcdd6b3f6733d6b1efa6aeb02 Mon Sep 17 00:00:00 2001 From: kohsuke Date: Mon, 6 Apr 2009 03:21:57 +0000 Subject: [PATCH] added trend reporting git-svn-id: https://hudson.dev.java.net/svn/hudson/trunk/hudson/main@16861 71c3de6d-444a-0410-be80-ed276b4c234a --- .../java/hudson/model/MemoryUsageMonitor.java | 41 +++++++++++++++---- 1 file changed, 32 insertions(+), 9 deletions(-) diff --git a/core/src/main/java/hudson/model/MemoryUsageMonitor.java b/core/src/main/java/hudson/model/MemoryUsageMonitor.java index 3bd6d2aab9..d29a4c995f 100644 --- a/core/src/main/java/hudson/model/MemoryUsageMonitor.java +++ b/core/src/main/java/hudson/model/MemoryUsageMonitor.java @@ -23,7 +23,8 @@ */ package hudson.model; -import hudson.triggers.SafeTimerTask; +import hudson.util.TimeUnit2; +import hudson.Extension; import java.lang.management.MemoryPoolMXBean; import java.lang.management.MemoryType; @@ -37,18 +38,32 @@ import java.util.ArrayList; * * @author Kohsuke Kawaguchi */ -public class MemoryUsageMonitor extends SafeTimerTask { - class MemoryGroup { +@Extension +public final class MemoryUsageMonitor extends PeriodicWork { + /** + * A memory group is conceptually a set of memory pools. + */ + public final class MemoryGroup { private final List pools = new ArrayList(); - MemoryGroup(List pools, MemoryType type) { + /** + * Trend of the memory usage, after GCs. + * So this shows the accurate snapshot of the footprint of live objects. + */ + public final MultiStageTimeSeries used = new MultiStageTimeSeries(0,0); + /** + * Trend of the maximum memory size, after GCs. + */ + public final MultiStageTimeSeries max = new MultiStageTimeSeries(0,0); + + private MemoryGroup(List pools, MemoryType type) { for (MemoryPoolMXBean pool : pools) { if (pool.getType() == type) this.pools.add(pool); } } - public String metrics() { + private void update() { long used = 0; long max = 0; long cur = 0; @@ -68,12 +83,15 @@ public class MemoryUsageMonitor extends SafeTimerTask { max /= 1024; cur /= 1024; - return String.format("%d/%d/%d (%d%%)",used,cur,max,used*100/max); + this.used.update(used); + this.max.update(max); +// +// return String.format("%d/%d/%d (%d%%)",used,cur,max,used*100/max); } } - private final MemoryGroup heap; - private final MemoryGroup nonHeap; + public final MemoryGroup heap; + public final MemoryGroup nonHeap; public MemoryUsageMonitor() { List pools = ManagementFactory.getMemoryPoolMXBeans(); @@ -81,7 +99,12 @@ public class MemoryUsageMonitor extends SafeTimerTask { nonHeap = new MemoryGroup(pools, MemoryType.NON_HEAP); } + public long getRecurrencePeriod() { + return TimeUnit2.SECONDS.toMillis(10); + } + protected void doRun() { - System.out.printf("%s\t%s\n", heap.metrics(), nonHeap.metrics()); + heap.update(); + nonHeap.update(); } } -- GitLab