1
selca 2022-08-18 12:22:21 +08:00
android 的这个虚拟机跟你平时用的虚拟机不是一个概念
|
2
nothingistrue 2022-08-18 12:24:18 +08:00
虚拟机又不是独立硬件,它卡的时候宿主机自然跟着卡。
|
3
BeautifulSoap 2022-08-18 12:29:26 +08:00 via Android
首先你需要知道什么是 java 虚拟机
然后你才能理解安卓的这虚拟机是什么东西 |
4
zagfai 2022-08-18 12:39:40 +08:00 4
正确来说应该叫 runtime ,不是 virtual machine?
|
5
AoEiuV020CN 2022-08-18 12:41:36 +08:00 via Android
因为你整部手机都是跑在虚拟机里的,
|
6
djoiwhud 2022-08-18 12:51:38 +08:00 via Android
你们说的是真的么?楼主说的卡,应该是因为 luancher 卡了。
表现出来就是整个手机都卡。 |
7
qbuer 2022-08-18 13:45:09 +08:00
会不会是手机卡,然后程序卡
|
8
autoxbc 2022-08-18 13:50:19 +08:00
调度策略问题,响应性提高,吞吐率就会下降,要找个平衡点
|
9
janus77 2022-08-18 13:51:21 +08:00
因为他占用的是硬件资源啊,内存都要满了,cpu 也要满了,其他程序肯定也会卡啊
|
10
DefoliationM 2022-08-18 13:53:24 +08:00
就是 linux 呀,只是程序用 java 虚拟机解释执行而已.
|
11
mxT52CRuqR6o5 2022-08-18 14:26:09 +08:00
这个 vm (虚拟机)是指 jvm ,而不是 vmware 那种东西
|
12
orangex 2022-08-18 15:07:47 +08:00 7
1. Android 程序并不是跑在楼主概念里中的虚拟机(比如 Virtual Box 、VMWare )里。虚拟机( Virtual Machine )这个词面来讲就是一种能虚拟出或抽象出某种环境的机器罢了,Virtual Box 是给操作系统虚拟化出一套硬件资源环境,JVM 是给 Java program 抽象出了一套无关平台的运行环境。
2. 对于楼主以为的 Virtual Box 这类虚拟机,运行在 Virtual Box 的系统中的程序卡的话,宿主就不会卡吗? 我想是不一定的。虚拟机中的系统确实是和宿主系统是独立的,但占用资源仍然是分配自宿主机,如果虚拟机对一些资源采用的是静态分配的技术,那很显然如果你分配给虚拟机太多的话,不管虚拟机中的系统中的程序卡不卡,你的宿主机都会卡。如果是指定上限,动态分配的技术的话,那随着虚拟机对资源的占用的过高,宿主理论上是会相对变卡的。当然了这也得看这个程序写的有多差……毕竟一个普通程序通常占用的资源不会那么夸张。 3.对于 Android 程序,一个程序卡,整部手机会卡。 上面说了,其实跟虚拟机不虚拟机没多大关系。关键在于,硬件资源是有限的( cpu 、内存、IO ),尤其是在捉襟见肘的移动设备上,所以当有其他进程抢占了或者各种原因反正你目前所在的进程(我理解楼主指的整部手机其实是桌面吧,launcher 也是一个进程)没有抢占不到足够的资源时,就有可能最终导致绘制上的迟滞,也就是感觉到卡。 |
13
iovekkk 2022-08-18 17:04:36 +08:00
Android 系统限制了每一个进程只有一个线程可以刷新 UI ,这个线程称之为 UI 线程或者主线程。
Android 系统 cpu 资源分配,其实就是轮流执行每个线程的指令,资源紧张时,每个线程获取到的 cpu 时间片自然就少 UI 线程获取不到充足的 cpu 资源,UI 绘制效率低,轻则造成帧率下降,页面刷新变慢 重则导致绘制流程完全停止,反馈到用户视角就是卡了 |
14
nothingistrue 2022-08-18 17:13:35 +08:00 1
@orangex #12
CPU 全虚拟化的时候(没开 VT 的 Vmware ),虚拟机跟 JVM 是差不多的,对于宿主机来说,就是个普通应用,这时候不会出现虚拟机内部闲着但是宿主机资源被占用的情况。 开 VT 半虚拟机化的时候,Hyper-V 这边是虚拟机跟宿主机一起调度,只能人为给虚拟机加限额,这时候虚拟机内部的 CPU 跟宿主机 CPU 是一体基本没区别的,也不会出现虚拟机内部闲着但是宿主机资源被占用的情况。其他虚拟化技术可能有出去,但大体是类似的。VT 虚拟化,基本都是在 CPU 的线程调度上入手。 以上仅限于 CPU ,或者也包含 GPU ,内存部分,即使是动态增缩内存,虚拟机都是独占的,分配不好就会出现虚拟机闲置但宿主机不够用的情况。 |
15
FrankHB 2022-08-18 20:42:51 +08:00 1
这问题跟你理解的虚拟机概念无关。不管你有没有理解错 Android 虚拟机实际怎么跑的,都没法避免卡。
——关键理由是,因为是连你看得见的 UI ,包括负责整个系统交互的主要逻辑,也在虚拟机里跑了。而且,这些关键逻辑难以和你卡的 app 隔离——即便是在不同实例,也需要共享输入输出的硬件而同步——对普通用户来讲,它们正常情况下就是被独占的( Android 默认也不像桌面系统一样有放弃会话切换用户的 UI )。 在这个前提下,硬件调度之类都是实现细节。 不跑在虚拟机里的更底层的宿主可以不卡,但是你感觉不出区别。 |
16
paradoxs 2022-08-18 20:46:16 +08:00
你在 windows 里面开个 vmware ,在 vmware 里面把性能拉满,你 windows 主机一样会卡。
|
17
wangyu17455 2022-08-19 13:20:43 +08:00
举个例子,你的程序覆盖了 home 键默认行为,然后程序卡死了,此时 home 键由你正在运行的程序处理,但是程序无响应,所以对 home 键的一切操作也都无响应,然后你按 home 键就不会回到桌面,界面也不刷新。但是系统其实跑的好好的,别的应用的 service 还是正常运行,比如说你在后台开了 qq 音乐,音乐还是正常播放但是你的屏幕动不了
|
18
orangex 2022-08-19 17:14:02 +08:00
14 楼详细解答了 CPU 及内存在不同虚拟化实现下的分配调度情况~ 可能尤为值得楼主记住是“CPU 全虚拟化时,对宿主机来说,就是个普通应用”
|