Bug 1821004 - Add summary.java-heap memory report. r=geckoview-reviewers,owlish

Android's memory profiler can show current java-heap size. Android M+
can get this usages from API. So this fix adds this entry to
about:memory.

Differential Revision: https://phabricator.services.mozilla.com/D172211
This commit is contained in:
Makoto Kato 2023-03-22 12:31:46 +00:00
parent d9c9e6a248
commit 8eccde2927
2 changed files with 59 additions and 0 deletions

View file

@ -40,6 +40,7 @@ import android.net.Network;
import android.net.NetworkInfo;
import android.os.Build;
import android.os.Bundle;
import android.os.Debug;
import android.os.LocaleList;
import android.os.Looper;
import android.os.PowerManager;
@ -1595,6 +1596,26 @@ public class GeckoAppShell {
return id == 0 ? info.nonLocalizedLabel.toString() : context.getString(id);
}
@WrapForJNI(calledFrom = "gecko")
private static int getMemoryUsage(final String stateName) {
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
// No API to get Java heap usages.
return -1;
}
final Debug.MemoryInfo memInfo = new Debug.MemoryInfo();
Debug.getMemoryInfo(memInfo);
final String usage = memInfo.getMemoryStat(stateName);
if (usage == null) {
return -1;
}
try {
return Integer.parseInt(usage);
} catch (final NumberFormatException e) {
return -1;
}
}
@WrapForJNI
public static native boolean isParentProcess();

View file

@ -43,6 +43,11 @@
#include "mozilla/ipc/UtilityProcessManager.h"
#include "mozilla/ipc/FileDescriptorUtils.h"
#ifdef MOZ_WIDGET_ANDROID
# include "mozilla/java/GeckoAppShellWrappers.h"
# include "mozilla/jni/Utils.h"
#endif
#ifdef XP_WIN
# include "mozilla/MemoryInfo.h"
@ -1606,6 +1611,35 @@ NS_IMPL_ISUPPORTS(DMDReporter, nsIMemoryReporter)
#endif // MOZ_DMD
#ifdef MOZ_WIDGET_ANDROID
class AndroidMemoryReporter final : public nsIMemoryReporter {
public:
NS_DECL_ISUPPORTS
AndroidMemoryReporter() = default;
NS_IMETHOD
CollectReports(nsIHandleReportCallback* aHandleReport, nsISupports* aData,
bool aAnonymize) override {
if (!jni::IsAvailable() || jni::GetAPIVersion() < 23) {
return NS_OK;
}
int32_t heap = java::GeckoAppShell::GetMemoryUsage("summary.java-heap"_ns);
if (heap > 0) {
MOZ_COLLECT_REPORT("java-heap", KIND_OTHER, UNITS_BYTES, heap * 1024,
"The private Java Heap usage");
}
return NS_OK;
}
private:
~AndroidMemoryReporter() = default;
};
NS_IMPL_ISUPPORTS(AndroidMemoryReporter, nsIMemoryReporter)
#endif
/**
** nsMemoryReporterManager implementation
**/
@ -1695,6 +1729,10 @@ nsMemoryReporterManager::Init() {
RegisterStrongReporter(new WindowsAddressSpaceReporter());
#endif
#ifdef MOZ_WIDGET_ANDROID
RegisterStrongReporter(new AndroidMemoryReporter());
#endif
#ifdef XP_UNIX
nsMemoryInfoDumper::Initialize();
#endif