[转]Interpret & JIT

本文探讨了构造函数中执行复杂代码是否会影响代码执行效率的问题。指出构造函数的执行效率与普通函数相同,并解释了JIT编译如何提高重复代码执行的效率。
记得以前看到过一种说法,在构造函数中不要写复杂的内容,要不然会影响代码执行的效率,因为构造函数每次都会解析执行。
然而如果认真看过这个ppt的都会发现,以上所说的观点是不成立的。
代码执行的两种方式,分别是interpret,我的理解就是每次都会翻译执行。还有一种就是JIT,第一次会翻译执行,当以后再次执行这段代码的时候就调用以前翻译的结果,所以效率会比较高。

那么在as中,哪些不会在JIT中执行呢。flash会有一个初始化的过程,首先是全局$init,这里会初始化一个as文件为单位中的类,这里并不是实例。然后是$cinit,这里会初始化类中所有的静态方法,属性等。最后结束全局的$init。

下面才是真正进入JIT的时候,那也就是说在构造函数中执行代码的效率和普通的函数是一样快的。
下面给你一个 **工程级的、可直接排查的 checklist**,总结: **为什么你们设备开机后 Inactive 内存比对比机大?** 这是 OEM 性能团队最常遇到的问题,我直接按关键原因逐条拆解(从概率最高到最低)。 --- #  核心答案: **开机 inactive 比对比机大,90% 情况是 “文件页 (inactive_file) 多”。** 原因往往是:“你们 ROM 在开机阶段加载了更多文件资源 / 预加载内容较重”。 下面按技术原因展开。 --- # ✅ 一、你们设备开机 Inactive 高的最常见 9 大原因(按概率排序) --- # ① **Zygote preload 内容更多(最常见)** 涉及文件: * `/system/framework/*.jar` * `/system/lib64/*.so` * ICU data * 字体 * WebView 资源 **表现**: * inactive_file 高 * active_file 对比机差不多 * anon 内存差不多 **原因**: 厂商 ROM 会修改 Zygote preload 列表,如: * preload 更多资源(比如美化字体、定制 UI、预加载 WebView) * preload 大 jar/so  **这是 Android inactive 差异第一大原因。** --- # ② **SystemUI / Launcher 资源更大(也非常常见)** SystemUI、Launcher 通常占用非常多的 dex/so/page cache。 如果你们主题、图标包、美化动画更大,则: * 更多 .png / .xml / layout 进入 file cache → inactive_file 增加 * Dex 分包更多 → dex mmap 更大 **特别注意:** 主题引擎 / 动效引擎 会导致 inactive_file 激增。 --- # ③ **GMS + 厂商后台服务更多** 如果你们设备比对比机多: * GMS 服务 * 云同步 * 推送 * 账户 * 自带应用 * 数据分析 SDK 这些全部会: * mmap 更多文件 * fork 更多进程 * 产生更多 file cache 表现: * inactive_file 大 * 使用不久即被 kswapd 从 active 推到 inactive --- # ④ **WebView preload / WebView provider 资源大** 部分机型设置: * 开机预初始化 WebView * 或 WebView provider 更大(Chromium 大小差异 40MB~200MB) **表现**:inactive_file 激增。 **验证方法:** `dumpsys webviewupdate` --- # ⑤ **厂商定制的预加载服务(Most OEM Bug 来源)** 常见预加载导致 inactive 偏大: * AI 引擎初始化 * 相机 HAL 提前 warm-up * 相册扫描 * 文件扫描 * A/B OTA verification * 自启动应用(社交 / 音乐 / 游戏) **这些都会生成大量 file cache**,之后被动进入 inactive。 --- # ⑥ **Dex2Oat / vm-zygote 提前 OAT 优化行为更 aggressive** 部分 ROM 会在开机: * 预 JIT * 预 interpret * dex2oat optimize * 安全扫描 dex/so 这些操作会 mmap 大量文件,最终沉淀为 inactive。 --- # ⑦ **CMA / ION / GPU buffer 占用间接导致 inactive 偏大** 大量不可回收内存(显示、相机、GPU)占住 RAM → kswapd 压力提高 → active 推到 inactive。 表现: * active 降低 * inactive 增大 * pgscan_kswapd 增多 --- # ⑧ **ZRAM / swappiness 导致 anon 页提前进入 inactive** 如果你们配置: ``` vm.swappiness > 对比机 ``` 则: * 匿名页更快从 active → inactive → swap * inactive_anon 偏大(并且伴随 swap) --- # ⑨ **内核 reclaim 策略不同(水位线/kswapd行位不同)** 如你们机型: * watermark_scale_factor 更高 * min_free_kbytes 更大 * LMKD 触发更早或更晚 * kswapd 扫描更频繁 则: * active 页更快被挤到 inactive * inactive 收益增大 --- # 里 —— 排查要点(非常关键)—— ##  1. 先看 inactive 组成(最关键的判断) ``` cat /proc/meminfo | grep -i Inactive cat /proc/meminfo | grep -i file cat /proc/meminfo | grep -i anon ``` 判断: * **inactive_file 高? → 文件预加载问题** * **inactive_anon 高? → ZRAM / swappiness / 进程匿名页大** --- ##  2. 看对比机的 Zygote preload 列表差异 ``` adb shell ps -A | grep zygote adb shell dumpsys zygote ``` 比较: * preload-resources 大小 * preload-dex 列表 * preload-libs --- ##  3. 看 system_server 的 mmap 文件大小差异 ``` cat /proc/$(pidof system_server)/smaps | grep -i -E "file|anon" ``` --- ##  4. 看 WebView provider 不同 ``` adb shell pm list packages | grep webview ``` Chromium 不同版本体积差异可达 **150MB**。 --- ##  5. 看是否存在预加载服务 ``` adb shell ps -A --sort=start_time adb shell am dumpheap system_server /data/local/tmp/ss.hprof ``` 系统进程是否比对比机多。 --- #  总结一句话(工程结论) > **开机 inactive 高,最常见原因是文件页多(inactive_file 多),来自 zygote preload + SystemUI/Launcher 资源 + WebView preload + 后台服务多。 > 内存 anonymous 页变化很小,核心差异都是 file cache 造成的。** --- #  如果你愿意,把下面两份发我(你机型与对比机): ``` cat /proc/meminfo cat /proc/vmstat | grep -E 'pgscan|pgsteal' dumpsys webviewupdate ``` 我可以直接帮你比对: ▶ 是文件页多? ▶ 是匿名页多? ▶ 是 WebView 资源更大? ▶ 是系统服务更多? ▶ 还是预加载过度? 能给你一个明确的来源结论。
11-22
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值