当前位置: 首页 > news >正文

江门模板建站定制wordpress免费博客主题

江门模板建站定制,wordpress免费博客主题,本地网站搭建软件,四川城乡住房建设厅官方网站基于版本#xff1a;Android R 0. 前言 在之前的两篇博文《Android 中app内存回收优化(一)》和 《Android 中app内存回收优化(二)》中详细剖析了 Android 中 app 内存优化的流程。这个机制的管理通过 CachedAppOptimizer 类管理#xff0c;为什么叫这个名字#xff0c;而不…基于版本Android R 0. 前言 在之前的两篇博文《Android 中app内存回收优化(一)》和 《Android 中app内存回收优化(二)》中详细剖析了 Android 中 app 内存优化的流程。这个机制的管理通过 CachedAppOptimizer 类管理为什么叫这个名字而不叫 AppCompact 等在之前的两篇博文中也提到了因为该类中还管理了一个重要功能freezer一个针对应用进程长期处于 Cached 状态的优化。 本文将继续分析 CachedAppOptimizer 类另一个功能 freezer。 1. Freezer 触发 在《Android oom_adj 更新原理(二)》中详细剖析了 OomAdjuster.applyOomAdjLocked() 函数在 oom_adj 发生变化之后会重新 compute 然后在 apply 在该函数中就是通过调用 updateAppFreezeStateLocked(app) 来确认是否冻结进程。 1.1 updateAppFreezeStateLocked() frameworks/base/services/core/java/com/android/server/am/OomAdjuster.javavoid updateAppFreezeStateLocked(ProcessRecord app) {// 确定该功能是使能的if (!mCachedAppOptimizer.useFreezer()) {return;}// 如果该进程处于 frozen状态但sholudNoFreeze变为true需要解冻if (app.frozen app.shouldNotFreeze) {mCachedAppOptimizer.unfreezeAppLocked(app);}// 如果该进程的 adj处于 CACHED并且可以冻结则调用 freezeAppAsync() 冻结// 如果该进程的 adj离开 CACHED则解冻if (app.curAdj ProcessList.CACHED_APP_MIN_ADJ !app.frozen !app.shouldNotFreeze) {mCachedAppOptimizer.freezeAppAsync(app);} else if (app.setAdj ProcessList.CACHED_APP_MIN_ADJ app.frozen) {mCachedAppOptimizer.unfreezeAppLocked(app);}} 2. CachedAppOptimizer.init() 对于CachedAppOptimizer 的构造调用以及 init() 函数的触发流程可以参考《Android 中app内存回收优化(一)》 一文第 1 节 和 第 2 节。 frameworks/base/services/core/java/com/android/server/am/CachedAppOptimizer.javapublic void init() {...synchronized (mPhenotypeFlagLock) {...updateUseFreezer();}} 2.1 updateUseFreezer() private void updateUseFreezer() {// 获取settings 中属性 cached_apps_freezer 的值根据属性值初始化变量mUseFreezerfinal String configOverride Settings.Global.getString(mAm.mContext.getContentResolver(),Settings.Global.CACHED_APPS_FREEZER_ENABLED);if (disabled.equals(configOverride)) {mUseFreezer false;} else if (enabled.equals(configOverride)|| DeviceConfig.getBoolean(DeviceConfig.NAMESPACE_ACTIVITY_MANAGER_NATIVE_BOOT,KEY_USE_FREEZER, DEFAULT_USE_FREEZER)) {mUseFreezer isFreezerSupported();}if (mUseFreezer mFreezeHandler null) {Slog.d(TAG_AM, Freezer enabled);enableFreezer(true);if (!mCachedAppOptimizerThread.isAlive()) {mCachedAppOptimizerThread.start();}mFreezeHandler new FreezeHandler();Process.setThreadGroupAndCpuset(mCachedAppOptimizerThread.getThreadId(),Process.THREAD_GROUP_SYSTEM);} else {enableFreezer(false);}} 首先确认 freezer 功能是否使能用个流程图来说明比较清晰 当 freezer 使能就会 调用 enableFreezer() 进行使能详细的流程可以查看第 4 节如果 CachedAppOptimizer 中的 ServiceThread 没有启动则启动创建 free handler用以处理 freezer 相关消息设置 ServiceThread 的优先级为 THREAD_GROUP_SYSTEM 3. cgroups 简介 cgroups (全称control groups) 是 Linux 内核提供的一种可以限制单个进程或者多个进程所使用资源的机制可以对 CPU、memory 等资源实现精细化的控制。目前越来越活的轻量级容器 Docker 就使用了 cgroups 提供的资源限制能力来完成 CPU、memory 等部门的资源控制。 cgroups 为每种可以控制的资源定义了一个子系统典型的子系统如下 cpu主要限制进程的 cpu 使用率cpuaat可以统计 cgroups 中的进程的 cpu 使用报告cpuset可以为 cgroups 中的进程分配单独的 cpu 节点或内存节点memory可以限制进程的 memory 使用量blkio可以限制进程的块设备 iodevices可以控制进程能够访问某些设备freezer可以挂起或恢复 cgroups 中的进程net_cls可以标记 cgroups 中进程的网络数据包然后可以使用 tc (traffic control)模块对数据包进行控制ns可以使不同的 cgroups 下面的进程使用不同的 namespace 在 Android Q 或更高版本通过 task profiles 使用 cgroup 抽象层task profiles 可以用来描述应用于某个线程或进程的一个set 或 sets 的限制。系统依照 task profiles 的规定选择一个或多个适当的 cgroups。通过这种限制可以对底层的 cgroup 功能集进行更改而不会影响较高的软件层。 具体的细节可以查看博文《Android 中 cgroup抽象层详解》 本文的很多重要特性都是通过 profile 的方式完成。 4. enableFreezer() 主要是调用 enableFreezerInternal() 函数 private static native void enableFreezerInternal(boolean enable); frameworks/base/services/core/jni/com_android_server_am_CachedAppOptimizer.cppstatic void com_android_server_am_CachedAppOptimizer_enableFreezerInternal(JNIEnv *env, jobject clazz, jboolean enable) {bool success true;if (enable) {success SetTaskProfiles(0, {FreezerEnabled}, true);} else {success SetTaskProfiles(0, {FreezerDisabled}, true);}if (!success) {jniThrowException(env, java/lang/RuntimeException, Unknown error);} } 通过接口 SetTaskProfiles() 往对应的节点写入特定的 value 值详细可以查看博文《Android 中 cgroup抽象层详解》 5. freezeAppAsync() 参数为 ProcessRecord 类型也就是对应的进程。 void freezeAppAsync(ProcessRecord app) {mFreezeHandler.removeMessages(SET_FROZEN_PROCESS_MSG, app);mFreezeHandler.sendMessageDelayed(mFreezeHandler.obtainMessage(SET_FROZEN_PROCESS_MSG, DO_FREEZE, 0, app),FREEZE_TIMEOUT_MS);} 注意 如果该进程已经发送 freeze 请求再次发送请求时先取消原来的消息发送消息 SET_FROZEN_PROCESS_MSG请求 freeze消息处理的延时时长为 FREEZE_TIMEOUT_MS(10 min)如果10 分钟之后冻结该进程的消息还没有被取消则进入冻结进程的流程 6. unfreezeAppLocked() void unfreezeAppLocked(ProcessRecord app) {// 首先取消之前该进程的冻结请求mFreezeHandler.removeMessages(SET_FROZEN_PROCESS_MSG, app);// 如果进程还没有冻结则无需做解冻处理if (!app.frozen) {return;}/********进程处于冻结进行解冻处理*********/boolean processKilled false;// 冻住的进程可以接收异步binder请求但是不会处理只是放入binder buffer 过多的请求会导致buffer耗尽// 这里需要确认下该进程在解冻之前进程是否在冰冻期间收到同步的binder 请求有则kill该进程try {int freezeInfo getBinderFreezeInfo(app.pid);if ((freezeInfo SYNC_RECEIVED_WHILE_FROZEN) ! 0) {Slog.d(TAG_AM, pid app.pid app.processName received sync transactions while frozen, killing);app.kill(Sync transaction while in frozen state,ApplicationExitInfo.REASON_OTHER,ApplicationExitInfo.SUBREASON_INVALID_STATE, true);processKilled true;}if ((freezeInfo ASYNC_RECEIVED_WHILE_FROZEN) ! 0) {Slog.d(TAG_AM, pid app.pid app.processName received async transactions while frozen);}} catch (Exception e) {Slog.d(TAG_AM, Unable to query binder frozen info for pid app.pid app.processName . Killing it. Exception: e);app.kill(Unable to query binder frozen stats,ApplicationExitInfo.REASON_OTHER,ApplicationExitInfo.SUBREASON_INVALID_STATE, true);processKilled true;}if (processKilled) {return;}long freezeTime app.freezeUnfreezeTime;try {freezeBinder(app.pid, false);} catch (RuntimeException e) {Slog.e(TAG_AM, Unable to unfreeze binder for app.pid app.processName . Killing it);app.kill(Unable to unfreeze,ApplicationExitInfo.REASON_OTHER,ApplicationExitInfo.SUBREASON_INVALID_STATE, true);return;}try {Process.setProcessFrozen(app.pid, app.uid, false);app.freezeUnfreezeTime SystemClock.uptimeMillis();app.frozen false;} catch (Exception e) {Slog.e(TAG_AM, Unable to unfreeze app.pid app.processName . This might cause inconsistency or UI hangs.);}if (!app.frozen) {if (DEBUG_FREEZER) {Slog.d(TAG_AM, sync unfroze app.pid app.processName);}mFreezeHandler.sendMessage(mFreezeHandler.obtainMessage(REPORT_UNFREEZE_MSG,app.pid,(int) Math.min(app.freezeUnfreezeTime - freezeTime, Integer.MAX_VALUE),app.processName));}}
http://www.pierceye.com/news/913093/

相关文章:

  • 网站建设得花多少钱做购物网站能否生存
  • 多语言网站 用什么cms深圳Wordpress网站
  • 常州市建设工程质量监督站网站开发公司设计管理岗位述职
  • 国外网站顶部菜单设计谷歌seo文章
  • 梅州网站开发外国自适应企业网站
  • 大型网站建设动力无限哪个公司的装饰设计公司
  • 网站建设与管理自考wordpress替换默认的编辑器
  • 企业在网站推广咸阳做网站开发公司
  • 从美洲开始做皇帝免费阅读网站wordpress嵌入优酷视频播放
  • 长沙 外贸网站建设国际足联世界排名
  • 辽宁省建设执业继续教育协会网站深圳网站制作建设服务公司
  • 个人网站备案都需要什么运营seo是什么意思
  • 局域网内部网站建设app下载苏州网络推广企业
  • 重庆美邦 网站建设保定最新消息发布
  • 东莞手机建网站旅游网站 分析
  • 网站seo优化技术入门做网站怎样实现网上支付
  • 陕西西安网站建设公司源码编程器
  • 网站开发的前端技术有哪些软件制作是什么专业
  • 淘宝网站建设目标是什么意思厦门seo计费
  • 高端网站建设注意简述网络营销的基本方法
  • html5网站开发实例教程沈阳软件定制开发公司
  • 做透水砖的网站下载爱南宁乘车
  • 免费建设工程信息网站许昌市建设路小学网站
  • 网站建设公司华网天如何设置自己的网址
  • 株洲做网站那家好黑龙江网站设计
  • 培训视频网站百度权重划分等级
  • 重庆江北区网站建设怎么查询网站建设时间
  • 做网站一个月能挣多少怎么做营销推广
  • 网站做镜像检查漏洞网站建设需要哪些步骤
  • 广州手机建设网站wordpress 读者墙