From 483eedc3f30dcaf7ddb2f1b928db8608d9d38ffe Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Fri, 21 Dec 2012 11:43:46 -0800 Subject: [PATCH] Add JNI statistics to the SIGQUIT output. Bug: 7903975 Change-Id: Ibc011ef73c8632fec42b846fcdee20c970951757 --- vm/Jni.cpp | 26 ++++++++++++++++++++++++++ vm/JniInternal.h | 4 ++++ vm/SignalCatcher.cpp | 2 ++ 3 files changed, 32 insertions(+) diff --git a/vm/Jni.cpp b/vm/Jni.cpp index 29badb753..7704ba700 100644 --- a/vm/Jni.cpp +++ b/vm/Jni.cpp @@ -19,6 +19,7 @@ */ #include "Dalvik.h" #include "JniInternal.h" +#include "Misc.h" #include "ScopedPthreadMutexLock.h" #include "UniquePtr.h" @@ -654,6 +655,31 @@ void dvmDumpJniReferenceTables() { dvmDumpReferenceTable(&gDvm.jniPinRefTable, "JNI pinned array"); } +void dvmDumpJniStats(DebugOutputTarget* target) { + dvmPrintDebugMessage(target, "JNI: CheckJNI is %s", gDvmJni.useCheckJni ? "on" : "off"); + if (gDvmJni.forceCopy) { + dvmPrintDebugMessage(target, " (with forecopy)"); + } + dvmPrintDebugMessage(target, "; workarounds are %s", gDvmJni.workAroundAppJniBugs ? "on" : "off"); + + dvmLockMutex(&gDvm.jniPinRefLock); + dvmPrintDebugMessage(target, "; pins=%d", dvmReferenceTableEntries(&gDvm.jniPinRefTable)); + dvmUnlockMutex(&gDvm.jniPinRefLock); + + dvmLockMutex(&gDvm.jniGlobalRefLock); + dvmPrintDebugMessage(target, "; globals=%d", gDvm.jniGlobalRefTable.capacity()); + dvmUnlockMutex(&gDvm.jniGlobalRefLock); + + dvmLockMutex(&gDvm.jniWeakGlobalRefLock); + size_t weaks = gDvm.jniWeakGlobalRefTable.capacity(); + if (weaks > 0) { + dvmPrintDebugMessage(target, " (plus %d weak)", weaks); + } + dvmUnlockMutex(&gDvm.jniWeakGlobalRefLock); + + dvmPrintDebugMessage(target, "\n\n"); +} + /* * Verify that a reference passed in from native code is one that the * code is allowed to have. diff --git a/vm/JniInternal.h b/vm/JniInternal.h index df92df651..8bb5975c2 100644 --- a/vm/JniInternal.h +++ b/vm/JniInternal.h @@ -162,4 +162,8 @@ void dvmReleaseJniMonitors(Thread* self); */ void dvmDumpJniReferenceTables(void); +// Dumps JNI statistics in response to SIGQUIT. +struct DebugOutputTarget; +void dvmDumpJniStats(DebugOutputTarget* target); + #endif // DALVIK_JNIINTERNAL_H_ diff --git a/vm/SignalCatcher.cpp b/vm/SignalCatcher.cpp index c29f19ad1..a4beb6b20 100644 --- a/vm/SignalCatcher.cpp +++ b/vm/SignalCatcher.cpp @@ -120,6 +120,7 @@ static void logThreadStacks(FILE* fp) ptm->tm_hour, ptm->tm_min, ptm->tm_sec); printProcessName(&target); dvmPrintDebugMessage(&target, "\n"); + dvmDumpJniStats(&target); dvmDumpAllThreadsEx(&target, true); fprintf(fp, "----- end %d -----\n", pid); } @@ -151,6 +152,7 @@ static void handleSigQuit() /* just dump to log */ DebugOutputTarget target; dvmCreateLogOutputTarget(&target, ANDROID_LOG_INFO, LOG_TAG); + dvmDumpJniStats(&target); dvmDumpAllThreadsEx(&target, true); } else { /* write to memory buffer */ -- 2.11.0