不兼容VirtualBox虚拟机,微软不再发布java虚拟机 为什么

操作系统为什么不内置java虚拟机?

不兼容VirtualBox虚拟机,微软不再发布java虚拟机 为什么


【不兼容VirtualBox虚拟机,微软不再发布java虚拟机 为什么】诚邀其实这个问题是要明白操作系统是什么 , 操作系统是为了分离硬件于用户程序 , 操作系统主要用来管理硬件资源 , 系统调度 , 其他的功能只是为了效率上提升 , 内核要增加的一些接口 , 主要为了减少用户程序跟内核通信造成的效率降低 , java虚拟机 , 是为了执行java程序 , 制作的一种用户态程序 , 本身不具备操作系统的能力 , 仅仅用来解析java的字节码 , 并不能直接被硬件识别 , 所以必须要有操作系统转译 , 而且java虚拟机目的就是为了让java程序可以一次编写 , 多处执行 , 但操作系统是可以脱离java虚拟机存在的 , 所以 , 应该不会考虑将java虚拟机做到操作系统里 。
Java能不能像C语言不通过JVM虚拟机直接编译成二进制机器码 , 让计算机直接运行?
从语言设计的角度看是可以的 , 重新设计一下编译器就能实现 , 但从工程实践的角度看是不可行的 。其一 , Java语言最大的特点就是跨平台可移植 , 一次开发 , 一次编译 , 多平台执行 , 这一特性就是靠JVM(Java虚拟机)实现的 , 如果改写编译器像C语言一样直接编译成了可执行程序 , 就失去了跨平台特性 。其二 , Java语言设计之初就设计成为了一款严重依赖JRE(Java运行时环境)的语言 , 有部分语言设计上的缺陷必须依赖JVM来解决 , 比如GC(垃圾回收) , 我们知道 , Java语言是没有内存回收能力的 , 因此还得靠JVM , 在工程实践中 , 如果软件不能进行内存回收 , 后果将是灾难性的 。
其三 , Java语言是面向对象的 , 区别于同是面向对象的C , Java还有一个动态特性 。它允许程序动态地装入运行过程中所需要的类 , 这是C语言进行面向对象程序设计所无法实现的 。在C程序设计过程中 , 每当在类中增加一个实例变量或一种成员函数后 , 引用该类的所有子类都必须重新编译 , 否则将导致程序崩溃 。Java从如下几方面采取措来解决这个问题 。
Java编译器不是将对实例变量和成员函数的引用编译为数值引用 , 而是将符号引用信息在字节码中保存下传递给解释器 , 再由解释器在完成动态连接类后 , 将符号引用信息转换为数值偏移量 。这样 , 一个在存储器生成的对象不在编译过程中决定 , 而是延迟到运行时由解释器确定的 。这样 , 对类中的变量和方法进行更新时就不至于影响现存的代码 。
解释执行字节码时 , 这种符号信息的查找和转换过程仅在一个新的名字出现时才进行一次 , 随后代码便可以全速执行 。在运行时确定引用的好处是可以使用已被更新的类 , 而不必担心会影响原有的代码 。如果程序连接了网络中另一系统中的某一类 , 该类的所有者也可以自由地对该类进行更新 , 而不会使任何引用该类的程序崩溃 。而这一切同样依赖JRE 。
方舟编译器是将java代码像C静态编译 , 那么为什么安卓当时一开始为啥不用C?

推荐阅读