Merge branch 'readonly-p4-master'

This commit is contained in:
Andy McFadden
2009-04-08 00:37:08 -07:00
committed by The Android Open Source Project
2 changed files with 79 additions and 1 deletions

View File

@@ -632,6 +632,25 @@ href="{@docRoot}guide/developing/tools/traceview.html">Traceview: A Graphical Lo
*/
public static final native int getBinderDeathObjectCount();
/**
* Primes the register map cache.
*
* Only works for classes in the bootstrap class loader. Does not
* cause classes to be loaded if they're not already present.
*
* The classAndMethodDesc argument is a concatentation of the VM-internal
* class descriptor, method name, and method descriptor. Examples:
* Landroid/os/Looper;.loop:()V
* Landroid/app/ActivityThread;.main:([Ljava/lang/String;)V
*
* @param classAndMethodDesc the method to prepare
*
* @hide
*/
public static final boolean cacheRegisterMap(String classAndMethodDesc) {
return VMDebug.cacheRegisterMap(classAndMethodDesc);
}
/**
* API for gathering and querying instruction counts.
*

View File

@@ -93,7 +93,26 @@ public class ZygoteInit {
/** Controls whether we should preload resources during zygote init. */
private static final boolean PRELOAD_RESOURCES = true;
/**
* List of methods we "warm up" in the register map cache. These were
* chosen because they appeared on the stack in GCs in multiple
* applications.
*
* This is in a VM-ready format, to minimize string processing. If a
* class is not already loaded, or a method is not found, the entry
* will be skipped.
*
* This doesn't really merit a separately-generated input file at this
* time. The list is fairly short, and the consequences of failure
* are minor.
*/
private static final String[] REGISTER_MAP_METHODS = {
// (currently not doing any)
//"Landroid/app/Activity;.setContentView:(I)V",
};
/**
* Invokes a static "main(argv[]) method on class "className".
* Converts various failing exceptions into RuntimeExceptions, with
@@ -318,6 +337,45 @@ public class ZygoteInit {
}
}
/**
* Pre-caches register maps for methods that are commonly used.
*/
private static void cacheRegisterMaps() {
String failed = null;
int failure;
long startTime = System.nanoTime();
failure = 0;
for (int i = 0; i < REGISTER_MAP_METHODS.length; i++) {
String str = REGISTER_MAP_METHODS[i];
if (!Debug.cacheRegisterMap(str)) {
if (failed == null)
failed = str;
failure++;
}
}
long delta = System.nanoTime() - startTime;
if (failure == REGISTER_MAP_METHODS.length) {
if (REGISTER_MAP_METHODS.length > 0) {
Log.i(TAG,
"Register map caching failed (precise GC not enabled?)");
}
return;
}
Log.i(TAG, "Register map cache: found " +
(REGISTER_MAP_METHODS.length - failure) + " of " +
REGISTER_MAP_METHODS.length + " methods in " +
(delta / 1000000L) + "ms");
if (failure > 0) {
Log.i(TAG, " First failure: " + failed);
}
}
/**
* Load in commonly used resources, so they can be shared across
* processes.
@@ -510,6 +568,7 @@ public class ZygoteInit {
EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_START,
SystemClock.uptimeMillis());
preloadClasses();
//cacheRegisterMaps();
preloadResources();
EventLog.writeEvent(LOG_BOOT_PROGRESS_PRELOAD_END,
SystemClock.uptimeMillis());