Loading services/core/java/com/android/server/MemoryPressureUtil.java 0 → 100644 +56 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.server; import android.os.StrictMode; import android.util.Slog; import libcore.io.IoUtils; import java.io.File; import java.io.IOException; import java.io.StringWriter; /** * Utility method for memory pressure (PSI). */ public final class MemoryPressureUtil { private static final String FILE = "/proc/pressure/memory"; private static final String TAG = "MemoryPressure"; /** * @return a stanza about memory PSI to add to a report. */ public static String currentPsiState() { final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads(); StringWriter contents = new StringWriter(); try { if (new File(FILE).exists()) { contents.append("----- Output from /proc/pressure/memory -----\n"); contents.append(IoUtils.readFileAsString(FILE)); contents.append("----- End output from /proc/pressure/memory -----\n\n"); } } catch (IOException e) { Slog.e(TAG, "Could not read " + FILE, e); } finally { StrictMode.setThreadPolicy(savedPolicy); } return contents.toString(); } private MemoryPressureUtil(){} } services/core/java/com/android/server/Watchdog.java +2 −1 Original line number Diff line number Diff line Loading @@ -610,6 +610,8 @@ public class Watchdog extends Thread { if (mPhonePid > 0) pids.add(mPhonePid); long anrTime = SystemClock.uptimeMillis(); StringBuilder report = new StringBuilder(); report.append(MemoryPressureUtil.currentPsiState()); ProcessCpuTracker processCpuTracker = new ProcessCpuTracker(false); StringWriter tracesFileException = new StringWriter(); final File stack = ActivityManagerService.dumpStackTraces( Loading @@ -621,7 +623,6 @@ public class Watchdog extends Thread { SystemClock.sleep(5000); processCpuTracker.update(); StringBuilder report = new StringBuilder(); report.append(processCpuTracker.printCurrentState(anrTime)); report.append(tracesFileException.getBuffer()); Loading services/core/java/com/android/server/am/ProcessRecord.java +3 −1 Original line number Diff line number Diff line Loading @@ -66,6 +66,7 @@ import com.android.internal.os.BatteryStatsImpl; import com.android.internal.os.ProcessCpuTracker; import com.android.internal.os.Zygote; import com.android.internal.util.FrameworkStatsLog; import com.android.server.MemoryPressureUtil; import com.android.server.wm.WindowProcessController; import com.android.server.wm.WindowProcessListener; Loading Loading @@ -1582,6 +1583,8 @@ class ProcessRecord implements WindowProcessListener { info.append("Parent: ").append(parentShortComponentName).append("\n"); } StringBuilder report = new StringBuilder(); report.append(MemoryPressureUtil.currentPsiState()); ProcessCpuTracker processCpuTracker = new ProcessCpuTracker(true); // don't dump native PIDs for background ANRs unless it is the process of interest Loading Loading @@ -1614,7 +1617,6 @@ class ProcessRecord implements WindowProcessListener { (isSilentAnr()) ? null : processCpuTracker, (isSilentAnr()) ? null : lastPids, nativePids, tracesFileException); StringBuilder report = new StringBuilder(); if (isMonitorCpuUsage()) { mService.updateCpuStatsNow(); synchronized (mService.mProcessCpuTracker) { Loading Loading
services/core/java/com/android/server/MemoryPressureUtil.java 0 → 100644 +56 −0 Original line number Diff line number Diff line /* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.android.server; import android.os.StrictMode; import android.util.Slog; import libcore.io.IoUtils; import java.io.File; import java.io.IOException; import java.io.StringWriter; /** * Utility method for memory pressure (PSI). */ public final class MemoryPressureUtil { private static final String FILE = "/proc/pressure/memory"; private static final String TAG = "MemoryPressure"; /** * @return a stanza about memory PSI to add to a report. */ public static String currentPsiState() { final StrictMode.ThreadPolicy savedPolicy = StrictMode.allowThreadDiskReads(); StringWriter contents = new StringWriter(); try { if (new File(FILE).exists()) { contents.append("----- Output from /proc/pressure/memory -----\n"); contents.append(IoUtils.readFileAsString(FILE)); contents.append("----- End output from /proc/pressure/memory -----\n\n"); } } catch (IOException e) { Slog.e(TAG, "Could not read " + FILE, e); } finally { StrictMode.setThreadPolicy(savedPolicy); } return contents.toString(); } private MemoryPressureUtil(){} }
services/core/java/com/android/server/Watchdog.java +2 −1 Original line number Diff line number Diff line Loading @@ -610,6 +610,8 @@ public class Watchdog extends Thread { if (mPhonePid > 0) pids.add(mPhonePid); long anrTime = SystemClock.uptimeMillis(); StringBuilder report = new StringBuilder(); report.append(MemoryPressureUtil.currentPsiState()); ProcessCpuTracker processCpuTracker = new ProcessCpuTracker(false); StringWriter tracesFileException = new StringWriter(); final File stack = ActivityManagerService.dumpStackTraces( Loading @@ -621,7 +623,6 @@ public class Watchdog extends Thread { SystemClock.sleep(5000); processCpuTracker.update(); StringBuilder report = new StringBuilder(); report.append(processCpuTracker.printCurrentState(anrTime)); report.append(tracesFileException.getBuffer()); Loading
services/core/java/com/android/server/am/ProcessRecord.java +3 −1 Original line number Diff line number Diff line Loading @@ -66,6 +66,7 @@ import com.android.internal.os.BatteryStatsImpl; import com.android.internal.os.ProcessCpuTracker; import com.android.internal.os.Zygote; import com.android.internal.util.FrameworkStatsLog; import com.android.server.MemoryPressureUtil; import com.android.server.wm.WindowProcessController; import com.android.server.wm.WindowProcessListener; Loading Loading @@ -1582,6 +1583,8 @@ class ProcessRecord implements WindowProcessListener { info.append("Parent: ").append(parentShortComponentName).append("\n"); } StringBuilder report = new StringBuilder(); report.append(MemoryPressureUtil.currentPsiState()); ProcessCpuTracker processCpuTracker = new ProcessCpuTracker(true); // don't dump native PIDs for background ANRs unless it is the process of interest Loading Loading @@ -1614,7 +1617,6 @@ class ProcessRecord implements WindowProcessListener { (isSilentAnr()) ? null : processCpuTracker, (isSilentAnr()) ? null : lastPids, nativePids, tracesFileException); StringBuilder report = new StringBuilder(); if (isMonitorCpuUsage()) { mService.updateCpuStatsNow(); synchronized (mService.mProcessCpuTracker) { Loading