diff options
author | Hiroshi Yamauchi <yamauchi@google.com> | 2015-04-02 10:18:12 -0700 |
---|---|---|
committer | Hiroshi Yamauchi <yamauchi@google.com> | 2015-04-13 15:37:40 -0700 |
commit | a1c9f013c034fbddb9337cc5c7ecf0e5a8b77547 (patch) | |
tree | 77a722cae515f6b3c7ea54f5b0fd2435682ae55b /test/099-vmdebug | |
parent | 67592a44cd5600b3c007b9215e3e5296a61118e8 (diff) | |
download | android_art-a1c9f013c034fbddb9337cc5c7ecf0e5a8b77547.tar.gz android_art-a1c9f013c034fbddb9337cc5c7ecf0e5a8b77547.tar.bz2 android_art-a1c9f013c034fbddb9337cc5c7ecf0e5a8b77547.zip |
getRuntimeStat() support (ART).
Export some runtime stats (currently GC stats) via
VMDebug.getRuntimeStat().
Added several new GC stats such as blocking GC counts and GC count
histograms.
Bug: 19825248
Change-Id: I8ece9ed241dc3982dfd983d7159090ba82940dce
Diffstat (limited to 'test/099-vmdebug')
-rw-r--r-- | test/099-vmdebug/src/Main.java | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/test/099-vmdebug/src/Main.java b/test/099-vmdebug/src/Main.java index 4d781c3fc2..a8db0699ee 100644 --- a/test/099-vmdebug/src/Main.java +++ b/test/099-vmdebug/src/Main.java @@ -17,6 +17,7 @@ import java.io.File; import java.io.IOException; import java.lang.reflect.Method; +import java.util.Map; public class Main { public static void main(String[] args) throws Exception { @@ -26,6 +27,7 @@ public class Main { return; } testMethodTracing(); + testRuntimeStat(); } private static File createTempFile() throws Exception { @@ -109,10 +111,108 @@ public class Main { tempFile.delete(); } + private static void checkNumber(String s) throws Exception { + if (s == null) { + System.out.println("Got null string"); + return; + } + long n = Long.valueOf(s); + if (n < 0) { + System.out.println("Got negative number " + n); + } + } + + private static void checkHistogram(String s) throws Exception { + if (s == null || s.length() == 0) { + System.out.println("Got null or empty string"); + return; + } + String[] buckets = s.split(","); + long last_key = 0; + for (int i = 0; i < buckets.length; ++i) { + String bucket = buckets[i]; + if (bucket.length() == 0) { + System.out.println("Got empty bucket"); + continue; + } + String[] kv = bucket.split(":"); + if (kv.length != 2 || kv[0].length() == 0 || kv[1].length() == 0) { + System.out.println("Got bad bucket " + bucket); + continue; + } + long key = Long.valueOf(kv[0]); + long value = Long.valueOf(kv[1]); + if (key < 0 || value < 0) { + System.out.println("Got negative key or value " + bucket); + continue; + } + if (key < last_key) { + System.out.println("Got decreasing key " + bucket); + continue; + } + last_key = key; + } + } + + private static void testRuntimeStat() throws Exception { + // Invoke at least one GC and wait for 20 seconds or so so we get at + // least one bucket in the histograms. + for (int i = 0; i < 20; ++i) { + Runtime.getRuntime().gc(); + Thread.sleep(1000L); + } + String gc_count = VMDebug.getRuntimeStat("art.gc.gc-count"); + String gc_time = VMDebug.getRuntimeStat("art.gc.gc-time"); + String bytes_allocated = VMDebug.getRuntimeStat("art.gc.bytes-allocated"); + String bytes_freed = VMDebug.getRuntimeStat("art.gc.bytes-freed"); + String blocking_gc_count = VMDebug.getRuntimeStat("art.gc.blocking-gc-count"); + String blocking_gc_time = VMDebug.getRuntimeStat("art.gc.blocking-gc-time"); + String gc_count_rate_histogram = VMDebug.getRuntimeStat("art.gc.gc-count-rate-histogram"); + String blocking_gc_count_rate_histogram = + VMDebug.getRuntimeStat("art.gc.blocking-gc-count-rate-histogram"); + checkNumber(gc_count); + checkNumber(gc_time); + checkNumber(bytes_allocated); + checkNumber(bytes_freed); + checkNumber(blocking_gc_count); + checkNumber(blocking_gc_time); + checkHistogram(gc_count_rate_histogram); + checkHistogram(blocking_gc_count_rate_histogram); + } + + private static void testRuntimeStats() throws Exception { + // Invoke at least one GC and wait for 20 seconds or so so we get at + // least one bucket in the histograms. + for (int i = 0; i < 20; ++i) { + Runtime.getRuntime().gc(); + Thread.sleep(1000L); + } + Map<String, String> map = VMDebug.getRuntimeStats(); + String gc_count = map.get("art.gc.gc-count"); + String gc_time = map.get("art.gc.gc-time"); + String bytes_allocated = map.get("art.gc.bytes-allocated"); + String bytes_freed = map.get("art.gc.bytes-freed"); + String blocking_gc_count = map.get("art.gc.blocking-gc-count"); + String blocking_gc_time = map.get("art.gc.blocking-gc-time"); + String gc_count_rate_histogram = map.get("art.gc.gc-count-rate-histogram"); + String blocking_gc_count_rate_histogram = + map.get("art.gc.blocking-gc-count-rate-histogram"); + checkNumber(gc_count); + checkNumber(gc_time); + checkNumber(bytes_allocated); + checkNumber(bytes_freed); + checkNumber(blocking_gc_count); + checkNumber(blocking_gc_time); + checkHistogram(gc_count_rate_histogram); + checkHistogram(blocking_gc_count_rate_histogram); + } + private static class VMDebug { private static final Method startMethodTracingMethod; private static final Method stopMethodTracingMethod; private static final Method getMethodTracingModeMethod; + private static final Method getRuntimeStatMethod; + private static final Method getRuntimeStatsMethod; static { try { Class c = Class.forName("dalvik.system.VMDebug"); @@ -120,6 +220,8 @@ public class Main { Integer.TYPE, Integer.TYPE, Boolean.TYPE, Integer.TYPE); stopMethodTracingMethod = c.getDeclaredMethod("stopMethodTracing"); getMethodTracingModeMethod = c.getDeclaredMethod("getMethodTracingMode"); + getRuntimeStatMethod = c.getDeclaredMethod("getRuntimeStat", String.class); + getRuntimeStatsMethod = c.getDeclaredMethod("getRuntimeStats"); } catch (Exception e) { throw new RuntimeException(e); } @@ -136,5 +238,11 @@ public class Main { public static int getMethodTracingMode() throws Exception { return (int) getMethodTracingModeMethod.invoke(null); } + public static String getRuntimeStat(String statName) throws Exception { + return (String) getRuntimeStatMethod.invoke(null, statName); + } + public static Map<String, String> getRuntimeStats() throws Exception { + return (Map<String, String>) getRuntimeStatsMethod.invoke(null); + } } } |