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