Board logo

标题: [其他] 安卓虚拟机是什么意思? [打印本页]

作者: 帝斯特罗    时间: 2017-6-28 18:39     标题: 安卓虚拟机是什么意思?

看见虚片老说
作者: 天下围攻    时间: 2017-6-28 18:48

安卓是linux上运行JAVA虚拟机,在虚拟机里运行程序,效率低下
苹果就是Unix内核的系统,直接运行程序
作者: 安卓爱好者    时间: 2017-6-28 18:50

posted by wap, platform: iPhone
好像是因为安卓基于Java虚拟机。
作者: jun4rui    时间: 2017-6-28 19:05

posted by wap, platform: Chrome
虚拟内存、虚拟机,你不觉得有关系吗?很直接的表明了他在论坛虚拟了一个iPhone用户,似粉实黑iPhone的工作历程
作者: alexacc    时间: 2017-6-28 19:44

posted by wap, platform: Android
跟虚拟内存是寄生关系
作者: fatehe    时间: 2017-6-28 19:45

posted by wap, platform: Chrome
某个虚拟用户的G点
作者: ppigadvance    时间: 2017-6-28 19:59

posted by wap, platform: iPhone
都是虚字辈的,揭示了虚片作为华为员工对苹果明粉实黑的险恶用心。
作者: 帝斯特罗    时间: 2017-6-29 16:52

posted by wap, platform: Meizu 魅蓝2
真是虚伪
作者: 三枪    时间: 2017-6-29 17:41

听说FF以前在游戏区混的时候捧PS2踩xb,一直捧到PS3踩x360,外号从索狗一路变成臭贱逼索狗什么的,最终变成虚拟内存,PS3输了
然后转职来数码区捧苹果踩安卓
作者: 啤酒    时间: 2017-6-29 18:29

posted by wap, platform: iPhone
虚则实之,实则虚之
作者: KARUTO    时间: 2017-6-29 18:35

安卓为了当初的全世界大同计划,采用的JAVA为其应用层的实现方式,而java都是跑在JVM就是java虚拟机里面的。

而且Google自己搞了一套什么所谓的Dalvik virtual machine,这玩意儿效率更低,要打水果的应用,光靠纯虚拟机不行,怎么办呢,Google就在Dalvik里搞了个JNI,所谓的java原生介面,来和其他语言的函数库(主要是c和c++互通),所以基本上JNI在大型游戏和重度应用里早就用的很常见,不过这个只是调用运行层面的东西,JAVA还有一大特点就是程序载入JVM的时候非常缓慢而且消耗大量内存,所以安卓机器祖传普遍需要大内存不足为奇。再者,所谓的调用效率也是可圈可点,以下是别人做的测试。

JNI调用和C++直接调用测试,均for循环1,000,000,000次
JNI调用耗时:6,000ms        6.0ns/次

C++调用耗时:1,400ms        1.4ns/次

单次的时间差应该体现了JNI调用dll的额外时间损耗。这个简单函数的调用效率,C++是JNI的4~5倍。
作者: 蚁力神    时间: 2017-6-29 18:39

自己吹捧肾机各种好猴机各种渣,然后给自己的亲爹妈买了个杂粮红米,这就是安卓虚拟机
作者: francisic    时间: 2017-6-29 19:01

posted by wap, platform: Android
不是,你到底问的是一种科学还是虚low的屁眼子?
作者: 绝赞好评    时间: 2017-6-29 19:46

posted by wap, platform: iPhone
你们等着,还有4个小时虚片就下班了,你们完了
作者: lewx    时间: 2017-6-29 20:18

posted by wap, platform: Android
引用:
原帖由 @KARUTO  于 2017-6-29 18:35 发表
安卓为了当初的全世界大同计划,采用的JAVA为其应用层的实现方式,而java都是跑在JVM就是java虚拟机里面的。

而且Google自己搞了一套什么所谓的Dalvik virtual machine,这玩意儿效率更低,要打水果的应用,光靠纯虚拟机不行,怎么办呢,Google就在Dalvik里搞了个JNI,所谓的java原生介面,来和其他语言的函数库(主要是c和c++互通),所以基本上JNI在大型游戏和重度应用里早就用的很常见,不过这个只是调用运行层面的东西,JAVA还有一大特点就是程序载入JVM的时候非常缓慢而且消耗大量内存,所以安卓机器祖传普遍需要大内存不足为奇。再者,所谓的调用效率也是可圈可点,以下是别人做的测试。

JNI调用和C++直接调用测试,均for循环1,000,000,000次
JNI调用耗时:6,000ms        6.0ns/次

C++调用耗时:1,400ms        1.4ns/次

单次的时间差应该体现了JNI调用dll的额外时间损耗。这个简单函数的调用效率,C++是JNI的4~5倍。
正常使用差距在纳秒级别?
作者: KARUTO    时间: 2017-6-29 20:32

posted by wap, platform: iPhone
引用:
原帖由 @lewx  于 2017-6-29 20:18 发表
正常使用差距在纳秒级别?
理解能力捉急,基本的积分概念都不懂

本帖最后由 KARUTO 于 2017-6-29 20:33 通过手机版编辑
作者: asac    时间: 2017-6-29 20:44

iPhone用什么语言开发?
作者: 藕是张力    时间: 2017-6-30 01:17

posted by wap, platform: iPhone
引用:
原帖由 @asac  于 2017-6-29 20:44 发表
iPhone用什么语言开发?
水果官方用Objective-C,还有最近几年刚开始推的Swift

开发者使用任何Xcode支持的语言都可以
作者: wangmax    时间: 2017-6-30 11:20

6以后强制ART,安卓现在也是机器码。
作者: KARUTO    时间: 2017-6-30 18:41

posted by wap, platform: iPod iTouch
引用:
原帖由 @wangmax  于 2017-6-30 11:20 发表
6以后强制ART,安卓现在也是机器码。
你先搞清楚art的原理,说白了只是少一步编译,执行一样低能
作者: jun4rui    时间: 2017-6-30 23:28

posted by wap, platform: Chrome
引用:
原帖由 @KARUTO  于 2017-6-28 22:35 发表
安卓为了当初的全世界大同计划,采用的JAVA为其应用层的实现方式,而java都是跑在JVM就是java虚拟机里面的。

而且Google自己搞了一套什么所谓的Dalvik virtual machine,这玩意儿效率更低,要打水果的应用,光靠纯虚拟机不行,怎么办呢,Google就在Dalvik里搞了个JNI,所谓的java原生介面,来和其他语言的函数库(主要是c和c++互通),所以基本上JNI在大型游戏和重度应用里早就用的很常见,不过这个只是调用运行层面的东西,JAVA还有一大特点就是程序载入JVM的时候非常缓慢而且消耗大量内存,所以安卓机器祖传普遍需要大内存不足为奇。再者,所谓的调用效率也是可圈可点,以下是别人做的测试。

JNI调用和C++直接调用测试,均for循环1,000,000,000次
JNI调用耗时:6,000ms        6.0ns/次

C++调用耗时:1,400ms        1.4ns/次

单次的时间差应该体现了JNI调用dll的额外时间损耗。这个简单函数的调用效率,C++是JNI的4~5倍。
少年你这个数据都不对啊,Dalvik是几代以前的东西了
作者: KARUTO    时间: 2017-6-30 23:55

posted by wap, platform: iPhone
引用:
原帖由 @jun4rui  于 2017-6-30 23:28 发表
少年你这个数据都不对啊,Dalvik是几代以前的东西了
自己打脸了吧,art说白了就是预编译过后的dalvik,少了一次装载标准,但是效率并没比dalvik 有质的提升,还是虚拟机构架,而且感谢你的论据让大家可以看得更清楚
作者: jun4rui    时间: 2017-7-1 00:13

posted by wap, platform: Chrome
另外Android的JVM载入程序非常缓慢且消耗大量内存,这个麻烦看一下Android各种版本JVM的进化吧,ART是4.4就有的东西,现在都8.0了

这消息的出处应该是这里吧,一看就知道不是搞移动开发的,你这例子根本证明不了什么。

JNI本来就是用JAVA调用原生代码,JNI的全称就是Java Native Interface,java原生接口啊,给java代码和原生代码互相搞基用的,java、原生代码互相搞来搞去当然需要额外的损耗啊,就像Python调用C的库,这很正常。

JNI是两个基佬用网线互插振动棒通过网络搞基,你说怎么爽?

两者互相调用会有时间损耗,这又有什么关系?JAVA和原生代码之间又不需要频繁互通,谁没事写个for循环互通10亿次啊,这不有病吗?就像Python一样,我简单的任务自己干,复杂任务交给C代码去干,干完了返回个结果给我就好了,需要频繁调用吗?

本来这数据就是那人无聊测着好玩的
作者: jun4rui    时间: 2017-7-1 00:24

posted by wap, platform: Chrome
引用:
原帖由 @KARUTO  于 2017-6-30 03:55 发表
自己打脸了吧,art说白了就是预编译过后的dalvik,少了一次装载标准,但是效率并没比dalvik 有质的提升,还是虚拟机构架,而且感谢你的论据让大家可以看得更清楚
Dalvik是在运行中不断将字节码翻译成机器码,ART是一次性翻译成机器码。

所以从来就不是少了一次装载,而是少了很多次的翻译,你的错误在于以为Dalvik是在运行时再翻译,其实不是,Dalvik的JIT机制是在运行时不断翻译的。

另外你犯的一个错误就是ART从4.4推出至今已经更新过很多次了,假设Dalvik真的是多一次装载,但是多年时间来的编译器和虚拟机优化也能提供很大的性能飞跃了,就像Dalvik当初拥有JIT后性能就暴涨了一次。

最后,我贴的那个图是ART早期的性能对比,里面速度已经比Dalvik快了
作者: jun4rui    时间: 2017-7-1 00:28

posted by wap, platform: Chrome
顺便纠正下,ART是编译成Linux本地的ELF原生代码直接跑的
而Dalvik只是编译成dex格式的字节码,然后需要靠JIT引擎去解释执行


要是有人说ELF和dex跑的都很慢,那我只能呵呵了
作者: KARUTO    时间: 2017-7-1 00:51

posted by wap, platform: iPhone
Dalivk 本身就有jin 啊,执行层真的效率不行,art 编译并没有多大改变,而且art编译并不改变程序结构,本质还是要调用runtime

ART会把apk的代码编译成二进制程序,但是光有这个还是没法运行的,需要runtime。

所以还是个虚拟机

本帖最后由 KARUTO 于 2017-7-1 00:53 通过手机版编辑
作者: KARUTO    时间: 2017-7-1 00:55

还有java本身的编程特性是每执行一次就需要装载一次编译一次,art的改善是缩短了这个过程,使得效率提升。
作者: KARUTO    时间: 2017-7-1 00:58

安卓的os构架早定下来了,底层是c,应用层必然是java,既然是java肯定是虚拟机方式跑,就不要再纠结了行不行。

当然这个应用层的java是可以调用其他语言的库的,不过本质上就是java虚拟机,所以效率这种东西在java这里真心不存在的。
作者: jun4rui    时间: 2017-7-1 01:13

posted by wap, platform: Samsung
你对art的理解太浅了,可以去知乎先入门一下,不然解释起来很累
作者: KARUTO    时间: 2017-7-1 01:33

真心的,java机制都没搞清,你以为art出来的机器语言=可执行的?
Java Runtime Environment,JRE知道么…android sdk里面包含了 jre里的类库,所有app要实现功能首选调用的库就是java的runtime,要不然就是调用c++写的库,然则互通效率很低,就算翻译成机器码,运行时候还是要调jre的纯种安卓程序效率更低。
我劝你没事拿个eclipse自己好好写几段玩玩就知道怎么个运行过程了。
作者: wangmax    时间: 2017-7-1 09:49

引用:
原帖由 KARUTO 于 2017-7-1 00:51 发表
posted by wap, platform: iPhone
Dalivk 本身就有jin 啊,执行层真的效率不行,art 编译并没有多大改变,而且art编译并不改变程序结构,本质还是要调用runtime

ART会把apk的代码编译成二进制程序,但是光有这个 ...
你概念不对了。
不要把runtime定义为低效,iOS底层也是runtime,oc是动态语言,在调用时会通过runtime转换成c的。
作者: KARUTO    时间: 2017-7-1 11:26

引用:
原帖由 wangmax 于 2017-7-1 09:49 发表


你概念不对了。
不要把runtime定义为低效,iOS底层也是runtime,oc是动态语言,在调用时会通过runtime转换成c的。
runtime优点是方便,编程效率高执行效率低,而且JRE在runtime里都算效率极低的,主要还是java的低效。把art理解成直接转汇编那就太扯淡了…
作者: 安卓爱好者    时间: 2017-7-1 13:08

posted by wap, platform: iPhone
槽点很多嗯。

ART本质上仍然是一个Java虚拟机。它所支持的Dalvik指令集跟之前Dalvik VM所支持的一样,而该指令集是JVM指令集的一种机械映射,两个指令集之间高度对应。

ART当然还支持JNI。它对JNI的支持主要在源码的runtime/jni_*文件里实现,例如 runtime/jni_internal.cc。

ART虽然主要通过AOT编译支持Java的运行,但仍然带有解释器。
ART会自动选择一部分Java方法使用AOT编译的方式,在程序执行前就编译生成好相应的机器码,到真的运行时只需要执行那些机器码即可;但是没有被选上做AOT编译的Java方法则仍然需要由解释器来执行。
解释器的实现在 runtime/interpreter。最近还多了个用汇编写的优化版解释器,在 runtime/interpreter/mterp ,本质上就是把Dalvik VM的汇编写的解释器移植到了ART上。
另外ART其实从一开始就有计划支持JIT编译,只是最初发布的时候还没做到这块。现在的代码已经开始有一些初步实现了,其接口代码在 compiler/jit 。

至于ART上能不能用Java以外的编程语言,基本上原本Dalvik支持什么ART就支持什么——不想要Java的话其它JVM语言许多都能行,Groovy、Clojure、Scala啥的嗯。
作者: 安卓爱好者    时间: 2017-7-1 13:11

posted by wap, platform: iPhone
安卓从其诞生起就赋予了虚拟机的伟大基因,与生俱来的东西怎么可能丢弃?个别安卓爱好者可不要数典忘祖啊。
作者: 娇生冠养    时间: 2017-7-1 14:55

posted by wap, platform: iPhone
绕了半天弯子,安卓还是虚拟的
不知道何时来个效率更好的把它淘汰
作者: yiwenzi    时间: 2017-7-1 15:31

posted by wap, platform: iPhone
反正效率就是低 一直靠硬件搭救

底层就是虚拟 只能砍掉再来
作者: LTFYH    时间: 2017-7-1 23:45

posted by wap, platform: Android
都叫虚片了,肯定是虚拟内存 虚拟机系列了
作者: 帝斯特罗    时间: 2017-7-2 10:37

posted by wap, platform: Meizu 魅蓝2
虚片和很久以前说PS3虚拟内存的是一个人吗?
作者: 2207232    时间: 2017-7-2 11:28

posted by wap, platform: Android
引用:
原帖由 @帝斯特罗  于 2017-7-2 10:37 发表
虚片和很久以前说PS3虚拟内存的是一个人吗?
这理解就百分之百准确了




欢迎光临 TGFC Lifestyle (http://club.tgfcer.com/) Powered by Discuz! 6.0.0