不是说 Android 程序都是跑在虚拟机里面的吗,那为什么有时程序一卡,整部手机都跟着卡呢?

2022-08-18 12:20:43 +08:00
 eyeshuaji
虽然这个问题看起来有点搞笑,但是小白是真的不懂😂
6318 次点击
所在节点    Android
18 条回复
selca
2022-08-18 12:22:21 +08:00
android 的这个虚拟机跟你平时用的虚拟机不是一个概念
nothingistrue
2022-08-18 12:24:18 +08:00
虚拟机又不是独立硬件,它卡的时候宿主机自然跟着卡。
BeautifulSoap
2022-08-18 12:29:26 +08:00
首先你需要知道什么是 java 虚拟机

然后你才能理解安卓的这虚拟机是什么东西
zagfai
2022-08-18 12:39:40 +08:00
正确来说应该叫 runtime ,不是 virtual machine?
AoEiuV020CN
2022-08-18 12:41:36 +08:00
因为你整部手机都是跑在虚拟机里的,
djoiwhud
2022-08-18 12:51:38 +08:00
你们说的是真的么?楼主说的卡,应该是因为 luancher 卡了。

表现出来就是整个手机都卡。
qbuer
2022-08-18 13:45:09 +08:00
会不会是手机卡,然后程序卡
autoxbc
2022-08-18 13:50:19 +08:00
调度策略问题,响应性提高,吞吐率就会下降,要找个平衡点
janus77
2022-08-18 13:51:21 +08:00
因为他占用的是硬件资源啊,内存都要满了,cpu 也要满了,其他程序肯定也会卡啊
DefoliationM
2022-08-18 13:53:24 +08:00
就是 linux 呀,只是程序用 java 虚拟机解释执行而已.
mxT52CRuqR6o5
2022-08-18 14:26:09 +08:00
这个 vm (虚拟机)是指 jvm ,而不是 vmware 那种东西
orangex
2022-08-18 15:07:47 +08:00
1. Android 程序并不是跑在楼主概念里中的虚拟机(比如 Virtual Box 、VMWare )里。虚拟机( Virtual Machine )这个词面来讲就是一种能虚拟出或抽象出某种环境的机器罢了,Virtual Box 是给操作系统虚拟化出一套硬件资源环境,JVM 是给 Java program 抽象出了一套无关平台的运行环境。
2. 对于楼主以为的 Virtual Box 这类虚拟机,运行在 Virtual Box 的系统中的程序卡的话,宿主就不会卡吗?
我想是不一定的。虚拟机中的系统确实是和宿主系统是独立的,但占用资源仍然是分配自宿主机,如果虚拟机对一些资源采用的是静态分配的技术,那很显然如果你分配给虚拟机太多的话,不管虚拟机中的系统中的程序卡不卡,你的宿主机都会卡。如果是指定上限,动态分配的技术的话,那随着虚拟机对资源的占用的过高,宿主理论上是会相对变卡的。当然了这也得看这个程序写的有多差……毕竟一个普通程序通常占用的资源不会那么夸张。
3.对于 Android 程序,一个程序卡,整部手机会卡。
上面说了,其实跟虚拟机不虚拟机没多大关系。关键在于,硬件资源是有限的( cpu 、内存、IO ),尤其是在捉襟见肘的移动设备上,所以当有其他进程抢占了或者各种原因反正你目前所在的进程(我理解楼主指的整部手机其实是桌面吧,launcher 也是一个进程)没有抢占不到足够的资源时,就有可能最终导致绘制上的迟滞,也就是感觉到卡。
iovekkk
2022-08-18 17:04:36 +08:00
Android 系统限制了每一个进程只有一个线程可以刷新 UI ,这个线程称之为 UI 线程或者主线程。
Android 系统 cpu 资源分配,其实就是轮流执行每个线程的指令,资源紧张时,每个线程获取到的 cpu 时间片自然就少
UI 线程获取不到充足的 cpu 资源,UI 绘制效率低,轻则造成帧率下降,页面刷新变慢
重则导致绘制流程完全停止,反馈到用户视角就是卡了
nothingistrue
2022-08-18 17:13:35 +08:00
@orangex #12
CPU 全虚拟化的时候(没开 VT 的 Vmware ),虚拟机跟 JVM 是差不多的,对于宿主机来说,就是个普通应用,这时候不会出现虚拟机内部闲着但是宿主机资源被占用的情况。

开 VT 半虚拟机化的时候,Hyper-V 这边是虚拟机跟宿主机一起调度,只能人为给虚拟机加限额,这时候虚拟机内部的 CPU 跟宿主机 CPU 是一体基本没区别的,也不会出现虚拟机内部闲着但是宿主机资源被占用的情况。其他虚拟化技术可能有出去,但大体是类似的。VT 虚拟化,基本都是在 CPU 的线程调度上入手。

以上仅限于 CPU ,或者也包含 GPU ,内存部分,即使是动态增缩内存,虚拟机都是独占的,分配不好就会出现虚拟机闲置但宿主机不够用的情况。
FrankHB
2022-08-18 20:42:51 +08:00
这问题跟你理解的虚拟机概念无关。不管你有没有理解错 Android 虚拟机实际怎么跑的,都没法避免卡。

——关键理由是,因为是连你看得见的 UI ,包括负责整个系统交互的主要逻辑,也在虚拟机里跑了。而且,这些关键逻辑难以和你卡的 app 隔离——即便是在不同实例,也需要共享输入输出的硬件而同步——对普通用户来讲,它们正常情况下就是被独占的( Android 默认也不像桌面系统一样有放弃会话切换用户的 UI )。

在这个前提下,硬件调度之类都是实现细节。

不跑在虚拟机里的更底层的宿主可以不卡,但是你感觉不出区别。
paradoxs
2022-08-18 20:46:16 +08:00
你在 windows 里面开个 vmware ,在 vmware 里面把性能拉满,你 windows 主机一样会卡。
wangyu17455
2022-08-19 13:20:43 +08:00
举个例子,你的程序覆盖了 home 键默认行为,然后程序卡死了,此时 home 键由你正在运行的程序处理,但是程序无响应,所以对 home 键的一切操作也都无响应,然后你按 home 键就不会回到桌面,界面也不刷新。但是系统其实跑的好好的,别的应用的 service 还是正常运行,比如说你在后台开了 qq 音乐,音乐还是正常播放但是你的屏幕动不了
orangex
2022-08-19 17:14:02 +08:00
14 楼详细解答了 CPU 及内存在不同虚拟化实现下的分配调度情况~ 可能尤为值得楼主记住是“CPU 全虚拟化时,对宿主机来说,就是个普通应用”

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/873702

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX