event

您所在的位置:网站首页 投pss event

event

2024-07-07 00:28| 来源: 网络整理| 查看: 265

logcat_events.txt Line 26: Line 3847: 01-02 13:03:58.149279   887   901 I am_pss  : [16438,10036,com.android.systemui,52458496,47415296,146432] 16438 Pid 进程id 10036 Uid 用户id,Android作为单用户系统,Uid用于数据共享,可在AndroidManifest.xml中配置 com.android.systemui 进程名称 后面几个数字分别是 Pss Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存) Uss Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存) SwapPss swap交换分区,表示交换分区内存占用? am_pss 关键字  在源码中位置  \base\frameworks\base\services\core\java\com\android\server\am\EventLogTags.logtags 报告一个进程的内存使用情况

有规律的持续输出

# Report collection of memory used by a process 30047 am_pss (Pid|1|5),(UID|1|5),(Process Name|3),(PssKb|2|2),(UssKb|2|2)

调用 base\frameworks\base\services\core\java\com\android\server\am\ActivityManagerService.java BackgroundThread recordPssSampleLocked 后台线程完成内存信息打印  /**      * Record new PSS sample for a process.      */     void recordPssSampleLocked(ProcessRecord proc, int procState, long pss, long uss, long swapPss,             long now) {         EventLogTags.writeAmPss(proc.pid, proc.uid, proc.processName, pss * 1024, uss * 1024, //打印Log                 swapPss * 1024);         proc.lastPssTime = now;         proc.baseProcessTracker.addPss(pss, uss, true, proc.pkgList);         if (DEBUG_PSS) Slog.d(TAG_PSS,                 "PSS of " + proc.toShortString() + ": " + pss + " lastPss=" + proc.lastPss                 + " state=" + ProcessList.makeProcStateString(procState));         if (proc.initialIdlePss == 0) {             proc.initialIdlePss = pss;         }         proc.lastPss = pss;         proc.lastSwapPss = swapPss;         if (procState >= ActivityManager.PROCESS_STATE_HOME) {             proc.lastCachedPss = pss;             proc.lastCachedSwapPss = swapPss;         }

        final SparseArray watchUids                 = mMemWatchProcesses.getMap().get(proc.processName);         Long check = null;         if (watchUids != null) {             Pair val = watchUids.get(proc.uid);             if (val == null) {                 val = watchUids.get(0);             }             if (val != null) {                 check = val.first;             }         }         if (check != null) {             if ((pss * 1024) >= check && proc.thread != null && mMemWatchDumpProcName == null) {                 boolean isDebuggable = "1".equals(SystemProperties.get(SYSTEM_DEBUGGABLE, "0"));                 if (!isDebuggable) {                     if ((proc.info.flags&ApplicationInfo.FLAG_DEBUGGABLE) != 0) {                         isDebuggable = true;                     }                 }                 if (isDebuggable) {                     Slog.w(TAG, "Process " + proc + " exceeded pss limit " + check + "; reporting");                     final ProcessRecord myProc = proc;                     final File heapdumpFile = DumpHeapProvider.getJavaFile();                     mMemWatchDumpProcName = proc.processName;                     mMemWatchDumpFile = heapdumpFile.toString();                     mMemWatchDumpPid = proc.pid;                     mMemWatchDumpUid = proc.uid;                     BackgroundThread.getHandler().post(new Runnable() {                         @Override                         public void run() {                             revokeUriPermission(ActivityThread.currentActivityThread()                                             .getApplicationThread(),                                     DumpHeapActivity.JAVA_URI,                                     Intent.FLAG_GRANT_READ_URI_PERMISSION                                             | Intent.FLAG_GRANT_WRITE_URI_PERMISSION,                                     UserHandle.myUserId());                             ParcelFileDescriptor fd = null;                             try {                                 heapdumpFile.delete();                                 fd = ParcelFileDescriptor.open(heapdumpFile,                                         ParcelFileDescriptor.MODE_CREATE |                                                 ParcelFileDescriptor.MODE_TRUNCATE |                                                 ParcelFileDescriptor.MODE_WRITE_ONLY |                                                 ParcelFileDescriptor.MODE_APPEND);                                 IApplicationThread thread = myProc.thread;                                 if (thread != null) {                                     try {                                         if (DEBUG_PSS) Slog.d(TAG_PSS,                                                 "Requesting dump heap from "                                                 + myProc + " to " + heapdumpFile);                                         thread.dumpHeap(true, heapdumpFile.toString(), fd);                                     } catch (RemoteException e) {                                     }                                 }                             } catch (FileNotFoundException e) {                                 e.printStackTrace();                             } finally {                                 if (fd != null) {                                     try {                                         fd.close();                                     } catch (IOException e) {                                     }                                 }                             }                         }                     });                 } else {                     Slog.w(TAG, "Process " + proc + " exceeded pss limit " + check                             + ", but debugging not enabled");                 }             }         }     }

后台线程持续执行,并会有规律的输出 pss 信息 final Handler mBgHandler = new Handler(BackgroundThread.getHandler().getLooper()) {         @Override         public void handleMessage(Message msg) {             switch (msg.what) {             case COLLECT_PSS_BG_MSG: {                 long start = SystemClock.uptimeMillis();                 MemInfoReader memInfo = null;                 synchronized (ActivityManagerService.this) {                     if (mFullPssPending) {                         mFullPssPending = false;                         memInfo = new MemInfoReader();                     }                 }                 if (memInfo != null) {                     updateCpuStatsNow();                     long nativeTotalPss = 0;                     final List stats;                     synchronized (mProcessCpuTracker) {                         stats = mProcessCpuTracker.getStats( (st)-> {                             return st.vsize > 0 && st.uid < Process.FIRST_APPLICATION_UID;                         });                     }                     final int N = stats.size();                     for (int j = 0; j < N; j++) {                         synchronized (mPidsSelfLocked) {                             if (mPidsSelfLocked.indexOfKey(stats.get(j).pid) >= 0) {                                 // This is one of our own processes; skip it.                                 continue;                             }                         }                         nativeTotalPss += Debug.getPss(stats.get(j).pid, null, null);                     }                     memInfo.readMemInfo();                     synchronized (ActivityManagerService.this) {                         if (DEBUG_PSS) Slog.d(TAG_PSS, "Collected native and kernel memory in "                                 + (SystemClock.uptimeMillis()-start) + "ms");                         final long cachedKb = memInfo.getCachedSizeKb();                         final long freeKb = memInfo.getFreeSizeKb();                         final long zramKb = memInfo.getZramTotalSizeKb();                         final long kernelKb = memInfo.getKernelUsedSizeKb();                         EventLogTags.writeAmMeminfo(cachedKb*1024, freeKb*1024, zramKb*1024,                                 kernelKb*1024, nativeTotalPss*1024);                         mProcessStats.addSysMemUsageLocked(cachedKb, freeKb, zramKb, kernelKb,                                 nativeTotalPss);                     }                 }

                int num = 0;                 long[] tmp = new long[2];                 do {                     ProcessRecord proc;                     int procState;                     int pid;                     long lastPssTime;                     synchronized (ActivityManagerService.this) {                         if (mPendingPssProcesses.size() = 0 && app.lastStateTime



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3