V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
eyeshuaji
V2EX  ›  Android

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

  •  
  •   eyeshuaji · 2022-08-18 12:20:43 +08:00 · 6050 次点击
    这是一个创建于 607 天前的主题,其中的信息可能已经有所发展或是发生改变。
    虽然这个问题看起来有点搞笑,但是小白是真的不懂😂
    18 条回复    2022-08-19 17:14:02 +08:00
    selca
        1
    selca  
       2022-08-18 12:22:21 +08:00
    android 的这个虚拟机跟你平时用的虚拟机不是一个概念
    nothingistrue
        2
    nothingistrue  
       2022-08-18 12:24:18 +08:00
    虚拟机又不是独立硬件,它卡的时候宿主机自然跟着卡。
    BeautifulSoap
        3
    BeautifulSoap  
       2022-08-18 12:29:26 +08:00 via Android
    首先你需要知道什么是 java 虚拟机

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

    表现出来就是整个手机都卡。
    qbuer
        7
    qbuer  
       2022-08-18 13:45:09 +08:00
    会不会是手机卡,然后程序卡
    autoxbc
        8
    autoxbc  
       2022-08-18 13:50:19 +08:00
    调度策略问题,响应性提高,吞吐率就会下降,要找个平衡点
    janus77
        9
    janus77  
       2022-08-18 13:51:21 +08:00
    因为他占用的是硬件资源啊,内存都要满了,cpu 也要满了,其他程序肯定也会卡啊
    DefoliationM
        10
    DefoliationM  
       2022-08-18 13:53:24 +08:00
    就是 linux 呀,只是程序用 java 虚拟机解释执行而已.
    mxT52CRuqR6o5
        11
    mxT52CRuqR6o5  
       2022-08-18 14:26:09 +08:00
    这个 vm (虚拟机)是指 jvm ,而不是 vmware 那种东西
    orangex
        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 也是一个进程)没有抢占不到足够的资源时,就有可能最终导致绘制上的迟滞,也就是感觉到卡。
    iovekkk
        13
    iovekkk  
       2022-08-18 17:04:36 +08:00
    Android 系统限制了每一个进程只有一个线程可以刷新 UI ,这个线程称之为 UI 线程或者主线程。
    Android 系统 cpu 资源分配,其实就是轮流执行每个线程的指令,资源紧张时,每个线程获取到的 cpu 时间片自然就少
    UI 线程获取不到充足的 cpu 资源,UI 绘制效率低,轻则造成帧率下降,页面刷新变慢
    重则导致绘制流程完全停止,反馈到用户视角就是卡了
    nothingistrue
        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 ,内存部分,即使是动态增缩内存,虚拟机都是独占的,分配不好就会出现虚拟机闲置但宿主机不够用的情况。
    FrankHB
        15
    FrankHB  
       2022-08-18 20:42:51 +08:00   ❤️ 1
    这问题跟你理解的虚拟机概念无关。不管你有没有理解错 Android 虚拟机实际怎么跑的,都没法避免卡。

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

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

    不跑在虚拟机里的更底层的宿主可以不卡,但是你感觉不出区别。
    paradoxs
        16
    paradoxs  
       2022-08-18 20:46:16 +08:00
    你在 windows 里面开个 vmware ,在 vmware 里面把性能拉满,你 windows 主机一样会卡。
    wangyu17455
        17
    wangyu17455  
       2022-08-19 13:20:43 +08:00
    举个例子,你的程序覆盖了 home 键默认行为,然后程序卡死了,此时 home 键由你正在运行的程序处理,但是程序无响应,所以对 home 键的一切操作也都无响应,然后你按 home 键就不会回到桌面,界面也不刷新。但是系统其实跑的好好的,别的应用的 service 还是正常运行,比如说你在后台开了 qq 音乐,音乐还是正常播放但是你的屏幕动不了
    orangex
        18
    orangex  
       2022-08-19 17:14:02 +08:00
    14 楼详细解答了 CPU 及内存在不同虚拟化实现下的分配调度情况~ 可能尤为值得楼主记住是“CPU 全虚拟化时,对宿主机来说,就是个普通应用”
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2757 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 15:38 · PVG 23:38 · LAX 08:38 · JFK 11:38
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.