1 /*
2  * Copyright (C) 2020 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 package com.android.server.am;
18 
19 import static android.app.ActivityManager.PROCESS_STATE_NONEXISTENT;
20 import static android.app.ProcessMemoryState.HOSTING_COMPONENT_TYPE_EMPTY;
21 
22 import android.app.IApplicationThread;
23 import android.app.ProcessMemoryState.HostingComponentType;
24 import android.content.pm.ApplicationInfo;
25 import android.os.Debug;
26 import android.os.SystemClock;
27 import android.util.DebugUtils;
28 import android.util.TimeUtils;
29 
30 import com.android.internal.annotations.CompositeRWLock;
31 import com.android.internal.annotations.GuardedBy;
32 import com.android.internal.app.procstats.ProcessState;
33 import com.android.internal.app.procstats.ProcessStats;
34 import com.android.internal.util.FrameworkStatsLog;
35 import com.android.server.am.ProcessList.ProcStateMemTracker;
36 import com.android.server.power.stats.BatteryStatsImpl;
37 
38 import java.io.PrintWriter;
39 import java.util.concurrent.atomic.AtomicInteger;
40 import java.util.concurrent.atomic.AtomicLong;
41 
42 /**
43  * Profiling info of the process, such as PSS, cpu, etc.
44  */
45 final class ProcessProfileRecord {
46     final ProcessRecord mApp;
47 
48     private final ActivityManagerService mService;
49 
50     final Object mProfilerLock;
51 
52     @GuardedBy("mProfilerLock")
53     private final ProcessList.ProcStateMemTracker mProcStateMemTracker =
54             new ProcessList.ProcStateMemTracker();
55 
56     /**
57      * Stats of pss, cpu, etc.
58      */
59     @GuardedBy("mService.mProcessStats.mLock")
60     private ProcessState mBaseProcessTracker;
61 
62     /**
63      * Last time we retrieved PSS data.
64      */
65     @GuardedBy("mProfilerLock")
66     private long mLastPssTime;
67 
68     /**
69      * Next time we want to request PSS data.
70      */
71     @GuardedBy("mProfilerLock")
72     private long mNextPssTime;
73 
74     /**
75      * Initial memory pss of process for idle maintenance.
76      */
77     @GuardedBy("mProfilerLock")
78     private long mInitialIdlePss;
79 
80     /**
81      * Last computed memory pss.
82      */
83     @GuardedBy("mProfilerLock")
84     private long mLastPss;
85 
86     /**
87      * Last computed SwapPss.
88      */
89     @GuardedBy("mProfilerLock")
90     private long mLastSwapPss;
91 
92     /**
93      * Last computed pss when in cached state.
94      */
95     @GuardedBy("mProfilerLock")
96     private long mLastCachedPss;
97 
98     /**
99      * Last computed SwapPss when in cached state.
100      */
101     @GuardedBy("mProfilerLock")
102     private long mLastCachedSwapPss;
103 
104     /**
105      * Last computed memory rss.
106      */
107     @GuardedBy("mProfilerLock")
108     private long mLastRss;
109 
110     /**
111      * Cache of last retrieve memory info, to throttle how frequently apps can request it.
112      */
113     @GuardedBy("mProfilerLock")
114     private Debug.MemoryInfo mLastMemInfo;
115 
116     /**
117      * Cache of last retrieve memory uptime, to throttle how frequently apps can request it.
118      */
119     @GuardedBy("mProfilerLock")
120     private long mLastMemInfoTime;
121 
122     /**
123      * Currently requesting pss for.
124      */
125     @GuardedBy("mProfilerLock")
126     private int mPssProcState = PROCESS_STATE_NONEXISTENT;
127 
128     /**
129      * The type of stat collection that we are currently requesting.
130      */
131     @GuardedBy("mProfilerLock")
132     private int mPssStatType;
133 
134     /**
135      * How long proc has run CPU at last check.
136      */
137     final AtomicLong mLastCpuTime = new AtomicLong(0);
138 
139     /**
140      * How long proc has run CPU most recently.
141      */
142     final AtomicLong mCurCpuTime = new AtomicLong(0);
143 
144     /**
145      * Last selected memory trimming level.
146      */
147     @CompositeRWLock({"mService", "mProcLock"})
148     private int mTrimMemoryLevel;
149 
150     /**
151      * Want to clean up resources from showing UI?
152      */
153     @GuardedBy("mProcLock")
154     private boolean mPendingUiClean;
155 
156     /**
157      * Pointer to the battery stats of this process.
158      */
159     private BatteryStatsImpl.Uid.Proc mCurProcBatteryStats;
160 
161     /**
162      * When we last asked the app to do a gc.
163      */
164     @GuardedBy("mProfilerLock")
165     private long mLastRequestedGc;
166 
167     /**
168      * When we last told the app that memory is low.
169      */
170     @CompositeRWLock({"mService", "mProfilerLock"})
171     private long mLastLowMemory;
172 
173     /**
174      * Set to true when waiting to report low mem.
175      */
176     @GuardedBy("mProfilerLock")
177     private boolean mReportLowMemory;
178 
179     // ========================================================================
180     // Local copies of some process info, to avoid holding global AMS lock
181     @GuardedBy("mProfilerLock")
182     private int mPid;
183 
184     @GuardedBy("mProfilerLock")
185     private IApplicationThread mThread;
186 
187     @GuardedBy("mProfilerLock")
188     private int mSetProcState;
189 
190     @GuardedBy("mProfilerLock")
191     private int mSetAdj;
192 
193     @GuardedBy("mProfilerLock")
194     private int mCurRawAdj;
195 
196     @GuardedBy("mProfilerLock")
197     private long mLastStateTime;
198 
199     private AtomicInteger mCurrentHostingComponentTypes =
200             new AtomicInteger(HOSTING_COMPONENT_TYPE_EMPTY);
201 
202     private AtomicInteger mHistoricalHostingComponentTypes =
203             new AtomicInteger(HOSTING_COMPONENT_TYPE_EMPTY);
204 
205     private final ActivityManagerGlobalLock mProcLock;
206 
ProcessProfileRecord(final ProcessRecord app)207     ProcessProfileRecord(final ProcessRecord app) {
208         mApp = app;
209         mService = app.mService;
210         mProcLock = mService.mProcLock;
211         mProfilerLock = mService.mAppProfiler.mProfilerLock;
212     }
213 
init(long now)214     void init(long now) {
215         mLastPssTime = mNextPssTime = now;
216     }
217 
218     @GuardedBy("mService.mProcessStats.mLock")
getBaseProcessTracker()219     ProcessState getBaseProcessTracker() {
220         return mBaseProcessTracker;
221     }
222 
223     @GuardedBy("mService.mProcessStats.mLock")
setBaseProcessTracker(ProcessState baseProcessTracker)224     void setBaseProcessTracker(ProcessState baseProcessTracker) {
225         mBaseProcessTracker = baseProcessTracker;
226     }
227 
onProcessFrozen()228     void onProcessFrozen() {
229         synchronized (mService.mProcessStats.mLock) {
230             final ProcessState tracker = mBaseProcessTracker;
231             if (tracker != null) {
232                 final PackageList pkgList = mApp.getPkgList();
233                 final long now = SystemClock.uptimeMillis();
234                 synchronized (pkgList) {
235                     tracker.onProcessFrozen(now, pkgList.getPackageListLocked());
236                 }
237             }
238         }
239     }
240 
onProcessUnfrozen()241     void onProcessUnfrozen() {
242         synchronized (mService.mProcessStats.mLock) {
243             final ProcessState tracker = mBaseProcessTracker;
244             if (tracker != null) {
245                 final PackageList pkgList = mApp.getPkgList();
246                 final long now = SystemClock.uptimeMillis();
247                 synchronized (pkgList) {
248                     tracker.onProcessUnfrozen(now, pkgList.getPackageListLocked());
249                 }
250             }
251         }
252     }
253 
onProcessActive(IApplicationThread thread, ProcessStatsService tracker)254     void onProcessActive(IApplicationThread thread, ProcessStatsService tracker) {
255         if (mThread == null) {
256             synchronized (mProfilerLock) {
257                 synchronized (tracker.mLock) {
258                     final ProcessState origBase = getBaseProcessTracker();
259                     final PackageList pkgList = mApp.getPkgList();
260                     if (origBase != null) {
261                         synchronized (pkgList) {
262                             origBase.setState(ProcessStats.STATE_NOTHING,
263                                     tracker.getMemFactorLocked(), SystemClock.uptimeMillis(),
264                                     pkgList.getPackageListLocked());
265                         }
266                         origBase.makeInactive();
267                     }
268                     final ApplicationInfo info = mApp.info;
269                     final ProcessState baseProcessTracker = tracker.getProcessStateLocked(
270                             info.packageName, info.uid, info.longVersionCode, mApp.processName);
271                     setBaseProcessTracker(baseProcessTracker);
272                     baseProcessTracker.makeActive();
273                     pkgList.forEachPackage((pkgName, holder) -> {
274                         if (holder.state != null && holder.state != origBase) {
275                             holder.state.makeInactive();
276                         }
277                         tracker.updateProcessStateHolderLocked(holder, pkgName, mApp.info.uid,
278                                 mApp.info.longVersionCode, mApp.processName);
279                         if (holder.state != baseProcessTracker) {
280                             holder.state.makeActive();
281                         }
282                     });
283                     mThread = thread;
284                 }
285             }
286         } else {
287             synchronized (mProfilerLock) {
288                 mThread = thread;
289             }
290         }
291     }
292 
onProcessInactive(ProcessStatsService tracker)293     void onProcessInactive(ProcessStatsService tracker) {
294         synchronized (mProfilerLock) {
295             synchronized (tracker.mLock) {
296                 final ProcessState origBase = getBaseProcessTracker();
297                 if (origBase != null) {
298                     final PackageList pkgList = mApp.getPkgList();
299                     synchronized (pkgList) {
300                         origBase.setState(ProcessStats.STATE_NOTHING,
301                                 tracker.getMemFactorLocked(), SystemClock.uptimeMillis(),
302                                 pkgList.getPackageListLocked());
303                     }
304                     origBase.makeInactive();
305                     setBaseProcessTracker(null);
306                     pkgList.forEachPackageProcessStats(holder -> {
307                         if (holder.state != null && holder.state != origBase) {
308                             holder.state.makeInactive();
309                         }
310                         holder.pkg = null;
311                         holder.state = null;
312                     });
313                 }
314                 mThread = null;
315             }
316         }
317         mCurrentHostingComponentTypes.set(HOSTING_COMPONENT_TYPE_EMPTY);
318         mHistoricalHostingComponentTypes.set(HOSTING_COMPONENT_TYPE_EMPTY);
319     }
320 
321     @GuardedBy("mProfilerLock")
getLastPssTime()322     long getLastPssTime() {
323         return mLastPssTime;
324     }
325 
326     @GuardedBy("mProfilerLock")
setLastPssTime(long lastPssTime)327     void setLastPssTime(long lastPssTime) {
328         mLastPssTime = lastPssTime;
329     }
330 
331     @GuardedBy("mProfilerLock")
getNextPssTime()332     long getNextPssTime() {
333         return mNextPssTime;
334     }
335 
336     @GuardedBy("mProfilerLock")
setNextPssTime(long nextPssTime)337     void setNextPssTime(long nextPssTime) {
338         mNextPssTime = nextPssTime;
339     }
340 
341     @GuardedBy("mProfilerLock")
getInitialIdlePss()342     long getInitialIdlePss() {
343         return mInitialIdlePss;
344     }
345 
346     @GuardedBy("mProfilerLock")
setInitialIdlePss(long initialIdlePss)347     void setInitialIdlePss(long initialIdlePss) {
348         mInitialIdlePss = initialIdlePss;
349     }
350 
351     @GuardedBy("mProfilerLock")
getLastPss()352     long getLastPss() {
353         return mLastPss;
354     }
355 
356     @GuardedBy("mProfilerLock")
setLastPss(long lastPss)357     void setLastPss(long lastPss) {
358         mLastPss = lastPss;
359     }
360 
361     @GuardedBy("mProfilerLock")
getLastCachedPss()362     long getLastCachedPss() {
363         return mLastCachedPss;
364     }
365 
366     @GuardedBy("mProfilerLock")
setLastCachedPss(long lastCachedPss)367     void setLastCachedPss(long lastCachedPss) {
368         mLastCachedPss = lastCachedPss;
369     }
370 
371     @GuardedBy("mProfilerLock")
getLastSwapPss()372     long getLastSwapPss() {
373         return mLastSwapPss;
374     }
375 
376     @GuardedBy("mProfilerLock")
setLastSwapPss(long lastSwapPss)377     void setLastSwapPss(long lastSwapPss) {
378         mLastSwapPss = lastSwapPss;
379     }
380 
381     @GuardedBy("mProfilerLock")
getLastCachedSwapPss()382     long getLastCachedSwapPss() {
383         return mLastCachedSwapPss;
384     }
385 
386     @GuardedBy("mProfilerLock")
setLastCachedSwapPss(long lastCachedSwapPss)387     void setLastCachedSwapPss(long lastCachedSwapPss) {
388         mLastCachedSwapPss = lastCachedSwapPss;
389     }
390 
391     @GuardedBy("mProfilerLock")
getLastRss()392     long getLastRss() {
393         return mLastRss;
394     }
395 
396     @GuardedBy("mProfilerLock")
setLastRss(long lastRss)397     void setLastRss(long lastRss) {
398         mLastRss = lastRss;
399     }
400 
401     @GuardedBy("mProfilerLock")
getLastMemInfo()402     Debug.MemoryInfo getLastMemInfo() {
403         return mLastMemInfo;
404     }
405 
406     @GuardedBy("mProfilerLock")
setLastMemInfo(Debug.MemoryInfo lastMemInfo)407     void setLastMemInfo(Debug.MemoryInfo lastMemInfo) {
408         mLastMemInfo = lastMemInfo;
409     }
410 
411     @GuardedBy("mProfilerLock")
getLastMemInfoTime()412     long getLastMemInfoTime() {
413         return mLastMemInfoTime;
414     }
415 
416     @GuardedBy("mProfilerLock")
setLastMemInfoTime(long lastMemInfoTime)417     void setLastMemInfoTime(long lastMemInfoTime) {
418         mLastMemInfoTime = lastMemInfoTime;
419     }
420 
421     @GuardedBy("mProfilerLock")
getPssProcState()422     int getPssProcState() {
423         return mPssProcState;
424     }
425 
426     @GuardedBy("mProfilerLock")
setPssProcState(int pssProcState)427     void setPssProcState(int pssProcState) {
428         mPssProcState = pssProcState;
429     }
430 
431     @GuardedBy("mProfilerLock")
getPssStatType()432     int getPssStatType() {
433         return mPssStatType;
434     }
435 
436     @GuardedBy("mProfilerLock")
setPssStatType(int pssStatType)437     void setPssStatType(int pssStatType) {
438         mPssStatType = pssStatType;
439     }
440 
441     @GuardedBy(anyOf = {"mService", "mProcLock"})
getTrimMemoryLevel()442     int getTrimMemoryLevel() {
443         return mTrimMemoryLevel;
444     }
445 
446     @GuardedBy({"mService", "mProcLock"})
setTrimMemoryLevel(int trimMemoryLevel)447     void setTrimMemoryLevel(int trimMemoryLevel) {
448         mTrimMemoryLevel = trimMemoryLevel;
449     }
450 
451     @GuardedBy("mProcLock")
hasPendingUiClean()452     boolean hasPendingUiClean() {
453         return mPendingUiClean;
454     }
455 
456     @GuardedBy("mProcLock")
setPendingUiClean(boolean pendingUiClean)457     void setPendingUiClean(boolean pendingUiClean) {
458         mPendingUiClean = pendingUiClean;
459         mApp.getWindowProcessController().setPendingUiClean(pendingUiClean);
460     }
461 
getCurProcBatteryStats()462     BatteryStatsImpl.Uid.Proc getCurProcBatteryStats() {
463         return mCurProcBatteryStats;
464     }
465 
setCurProcBatteryStats(BatteryStatsImpl.Uid.Proc curProcBatteryStats)466     void setCurProcBatteryStats(BatteryStatsImpl.Uid.Proc curProcBatteryStats) {
467         mCurProcBatteryStats = curProcBatteryStats;
468     }
469 
470     @GuardedBy("mProfilerLock")
getLastRequestedGc()471     long getLastRequestedGc() {
472         return mLastRequestedGc;
473     }
474 
475     @GuardedBy("mProfilerLock")
setLastRequestedGc(long lastRequestedGc)476     void setLastRequestedGc(long lastRequestedGc) {
477         mLastRequestedGc = lastRequestedGc;
478     }
479 
480     @GuardedBy(anyOf = {"mService", "mProfilerLock"})
getLastLowMemory()481     long getLastLowMemory() {
482         return mLastLowMemory;
483     }
484 
485     @GuardedBy({"mService", "mProfilerLock"})
setLastLowMemory(long lastLowMemory)486     void setLastLowMemory(long lastLowMemory) {
487         mLastLowMemory = lastLowMemory;
488     }
489 
490     @GuardedBy("mProfilerLock")
getReportLowMemory()491     boolean getReportLowMemory() {
492         return mReportLowMemory;
493     }
494 
495     @GuardedBy("mProfilerLock")
setReportLowMemory(boolean reportLowMemory)496     void setReportLowMemory(boolean reportLowMemory) {
497         mReportLowMemory = reportLowMemory;
498     }
499 
addPss(long pss, long uss, long rss, boolean always, int type, long duration)500     void addPss(long pss, long uss, long rss, boolean always, int type, long duration) {
501         synchronized (mService.mProcessStats.mLock) {
502             final ProcessState tracker = mBaseProcessTracker;
503             if (tracker != null) {
504                 final PackageList pkgList = mApp.getPkgList();
505                 synchronized (pkgList) {
506                     tracker.addPss(pss, uss, rss, always, type, duration,
507                             pkgList.getPackageListLocked());
508                 }
509             }
510         }
511     }
512 
reportExcessiveCpu()513     void reportExcessiveCpu() {
514         synchronized (mService.mProcessStats.mLock) {
515             final ProcessState tracker = mBaseProcessTracker;
516             if (tracker != null) {
517                 final PackageList pkgList = mApp.getPkgList();
518                 synchronized (pkgList) {
519                     tracker.reportExcessiveCpu(pkgList.getPackageListLocked());
520                 }
521             }
522         }
523     }
524 
reportCachedKill()525     void reportCachedKill() {
526         synchronized (mService.mProcessStats.mLock) {
527             final ProcessState tracker = mBaseProcessTracker;
528             if (tracker != null) {
529                 final PackageList pkgList = mApp.getPkgList();
530                 synchronized (pkgList) {
531                     tracker.reportCachedKill(pkgList.getPackageListLocked(), mLastCachedPss);
532                     pkgList.forEachPackageProcessStats(holder ->
533                             FrameworkStatsLog.write(FrameworkStatsLog.CACHED_KILL_REPORTED,
534                                 mApp.info.uid,
535                                 holder.state.getName(),
536                                 holder.state.getPackage(),
537                                 mLastCachedPss,
538                                 holder.appVersion)
539                     );
540                 }
541             }
542         }
543     }
544 
setProcessTrackerState(int procState, int memFactor)545     void setProcessTrackerState(int procState, int memFactor) {
546         synchronized (mService.mProcessStats.mLock) {
547             final ProcessState tracker = mBaseProcessTracker;
548             if (tracker != null) {
549                 if (procState != PROCESS_STATE_NONEXISTENT) {
550                     final PackageList pkgList = mApp.getPkgList();
551                     final long now = SystemClock.uptimeMillis();
552                     synchronized (pkgList) {
553                         tracker.setState(procState, memFactor, now,
554                                 pkgList.getPackageListLocked());
555                     }
556                 }
557             }
558         }
559     }
560 
561     @GuardedBy("mProfilerLock")
commitNextPssTime()562     void commitNextPssTime() {
563         commitNextPssTime(mProcStateMemTracker);
564     }
565 
566     @GuardedBy("mProfilerLock")
abortNextPssTime()567     void abortNextPssTime() {
568         abortNextPssTime(mProcStateMemTracker);
569     }
570 
571     @GuardedBy("mProfilerLock")
computeNextPssTime(int procState, boolean test, boolean sleeping, long now)572     long computeNextPssTime(int procState, boolean test, boolean sleeping, long now) {
573         return ProcessList.computeNextPssTime(procState, mProcStateMemTracker, test, sleeping, now);
574     }
575 
commitNextPssTime(ProcStateMemTracker tracker)576     private static void commitNextPssTime(ProcStateMemTracker tracker) {
577         if (tracker.mPendingMemState >= 0) {
578             tracker.mHighestMem[tracker.mPendingMemState] = tracker.mPendingHighestMemState;
579             tracker.mScalingFactor[tracker.mPendingMemState] = tracker.mPendingScalingFactor;
580             tracker.mTotalHighestMem = tracker.mPendingHighestMemState;
581             tracker.mPendingMemState = -1;
582         }
583     }
584 
abortNextPssTime(ProcStateMemTracker tracker)585     private static void abortNextPssTime(ProcStateMemTracker tracker) {
586         tracker.mPendingMemState = -1;
587     }
588 
589     @GuardedBy("mProfilerLock")
getPid()590     int getPid() {
591         return mPid;
592     }
593 
594     @GuardedBy("mProfilerLock")
setPid(int pid)595     void setPid(int pid) {
596         mPid = pid;
597     }
598 
599     @GuardedBy("mProfilerLock")
getThread()600     IApplicationThread getThread() {
601         return mThread;
602     }
603 
604     @GuardedBy("mProfilerLock")
getSetProcState()605     int getSetProcState() {
606         return mSetProcState;
607     }
608 
609     @GuardedBy("mProfilerLock")
getSetAdj()610     int getSetAdj() {
611         return mSetAdj;
612     }
613 
614     @GuardedBy("mProfilerLock")
getCurRawAdj()615     int getCurRawAdj() {
616         return mCurRawAdj;
617     }
618 
619     @GuardedBy("mProfilerLock")
getLastStateTime()620     long getLastStateTime() {
621         return mLastStateTime;
622     }
623 
624     @GuardedBy({"mService", "mProfilerLock"})
updateProcState(ProcessStateRecord state)625     void updateProcState(ProcessStateRecord state) {
626         mSetProcState = state.getCurProcState();
627         mSetAdj = state.getCurAdj();
628         mCurRawAdj = state.getCurRawAdj();
629         mLastStateTime = state.getLastStateTime();
630     }
631 
addHostingComponentType(@ostingComponentType int type)632     void addHostingComponentType(@HostingComponentType int type) {
633         mCurrentHostingComponentTypes.set(mCurrentHostingComponentTypes.get() | type);
634         mHistoricalHostingComponentTypes.set(mHistoricalHostingComponentTypes.get() | type);
635     }
636 
clearHostingComponentType(@ostingComponentType int type)637     void clearHostingComponentType(@HostingComponentType int type) {
638         mCurrentHostingComponentTypes.set(mCurrentHostingComponentTypes.get() & ~type);
639     }
640 
getCurrentHostingComponentTypes()641     @HostingComponentType int getCurrentHostingComponentTypes() {
642         return mCurrentHostingComponentTypes.get();
643     }
644 
getHistoricalHostingComponentTypes()645     @HostingComponentType int getHistoricalHostingComponentTypes() {
646         return mHistoricalHostingComponentTypes.get();
647     }
648 
649     @GuardedBy("mService")
dumpPss(PrintWriter pw, String prefix, long nowUptime)650     void dumpPss(PrintWriter pw, String prefix, long nowUptime) {
651         synchronized (mProfilerLock) {
652             pw.print(prefix);
653             pw.print("lastPssTime=");
654             TimeUtils.formatDuration(mLastPssTime, nowUptime, pw);
655             pw.print(" pssProcState=");
656             pw.print(mPssProcState);
657             pw.print(" pssStatType=");
658             pw.print(mPssStatType);
659             pw.print(" nextPssTime=");
660             TimeUtils.formatDuration(mNextPssTime, nowUptime, pw);
661             pw.println();
662             pw.print(prefix);
663             pw.print("lastPss=");
664             DebugUtils.printSizeValue(pw, mLastPss * 1024);
665             pw.print(" lastSwapPss=");
666             DebugUtils.printSizeValue(pw, mLastSwapPss * 1024);
667             pw.print(" lastCachedPss=");
668             DebugUtils.printSizeValue(pw, mLastCachedPss * 1024);
669             pw.print(" lastCachedSwapPss=");
670             DebugUtils.printSizeValue(pw, mLastCachedSwapPss * 1024);
671             pw.print(" lastRss=");
672             DebugUtils.printSizeValue(pw, mLastRss * 1024);
673             pw.println();
674             pw.print(prefix);
675             pw.print("trimMemoryLevel=");
676             pw.println(mTrimMemoryLevel);
677             pw.print(prefix); pw.print("procStateMemTracker: ");
678             mProcStateMemTracker.dumpLine(pw);
679             pw.print(prefix);
680             pw.print("lastRequestedGc=");
681             TimeUtils.formatDuration(mLastRequestedGc, nowUptime, pw);
682             pw.print(" lastLowMemory=");
683             TimeUtils.formatDuration(mLastLowMemory, nowUptime, pw);
684             pw.print(" reportLowMemory=");
685             pw.println(mReportLowMemory);
686         }
687         pw.print(prefix);
688         pw.print("currentHostingComponentTypes=0x");
689         pw.print(Integer.toHexString(getCurrentHostingComponentTypes()));
690         pw.print(" historicalHostingComponentTypes=0x");
691         pw.println(Integer.toHexString(getHistoricalHostingComponentTypes()));
692     }
693 
dumpCputime(PrintWriter pw, String prefix)694     void dumpCputime(PrintWriter pw, String prefix) {
695         final long lastCpuTime = mLastCpuTime.get();
696         pw.print(prefix);
697         pw.print("lastCpuTime=");
698         pw.print(lastCpuTime);
699         if (lastCpuTime > 0) {
700             pw.print(" timeUsed=");
701             TimeUtils.formatDuration(mCurCpuTime.get() - lastCpuTime, pw);
702         }
703         pw.println();
704     }
705 }
706