java语言实现跨平台机制的原因

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java语言实现跨平台机制的原因相关的知识,希望对你有一定的参考价值。

JVM(java虚拟机的发展史):

    (1)Sun Classic

  1. classic jvm要么采用纯解释器解释执行,要么采用JIT编译执行,一旦JIT进行编译执行,则解释器不再生效
  2. 如果使用JIT编译代码,则JIT会对每个方法,每行代码都进行编译,对于那种只需运行一次,不具有编译价值的代码,也会被JIT编译执行。迫于程序响应时间的压力,此阶段的JIT不敢采用编译耗时的优化技术,所以及时采用JIT输出本地代码,他的执行效率也和C代码有很大差距。被人诟病“java语言很慢”

    (2)Exact VM

  1. Exact VM进入了高性能虚拟机时代,开始使用编译器解释器混合模式
  2. Exact VM使用了精确式内存管理,他能判定内存中摸个位置的数据具体是什么类型。eg:内存中有一个数是12345,ExactVM可以判断他是一个int数字,还是一个指向内存12345地址的引用。这种精确式内存管理,在gc时,可以直接回收引用类型的数据,少了像classic vm时代gc时的数据类型查找过程

    (3)HotSpot虚拟机

  1. Hot Spot是当前jdk采用的虚拟机 (1.4以后)
  2. 热点代码探测技术:通过计数器找出最具编译价值的代码,通知JIT以方法为单位进行编译。如果方法被频繁调用,则触发标准编译;如果方法中循环次数很多,触发栈上替换编译动作。
  3. HotSpot无需等待本地代码输出后才能执行程序,使得即时编译压力减小,有助于采用更更多的代码优化技术。输出高质量的操作系统本地代码

实现跨平台性能的原理:

    (1).我们都知道,java语言有个机制,就是不论是在哪个平台上编写的代码,在其他平台上都可以运行。一些语言却不行,比如在window平台下编写的语言在Linux系统下就无法运行,这个原因首先得从平台的机制说起。

我们所说的平台是由CPU和操作系统组成的,CPU的种类有很多,比如Inter,AMD等。这些不同品牌的CPU使用的指令集。而操作系统是充当用户和计算机之间交互的界面软件,不同的操作系统支持不同的CPU,严格意义上说是不同的操作系统支持不同CPU的指令集。例如  windows和liunx都支持Intel和AMD的复杂指令集,但并不支持PowerPC所使用的精简指令集,而早期的MAC电脑使用的是PowerPC处理器,所以也就无法在MAC下直接安装windows,直到05年MAC改用了Intel的CPU,才使在MAC下安装windows成为可能。但问题来了,原来的MAC 操作系统也只支持PowerPC,在Intel上也不能安装,怎么办?所以苹果公司也得重写自己的MAC操作系统以支持这种变化。最后总结下,我们要知道,不同的操作系统支持不同的CPU指令集,现在的windows,liunx,mac,solaris都支持Intel与AMD的CPU指令集。

  (2).我们一般说语言跨平台是说编译后的文件跨平台,并不是源程序跨平台。一般来说特定编译器编译的程序只能在特定平台运行。而java编译器编译出来的文件并不是机器语言,而是基于Unicode的字节码文件(.class)。之后使用java虚拟机(jvm)将字节码文件翻译成特定平台下的机器码然后运行。也就是说,只要在不同平台上安装对应的JVM,就可以运行字节码文件,运行我们编写的Java程序。而这个过程中,我们编写的Java程序没有做任何改变,仅仅是通过JVM这一”中间层“,就能在不同平台上运行,真正实现了”一次编译,到处运行“的目的。所以,运行Java程序必须有JVM的支持,因为编译的结果不是机器码,必须要经过JVM的再次翻译才能执行。即使你将Java程序打包成可执行文件(例如 .exe),仍然需要JVM的支持。

以上是关于java语言实现跨平台机制的原因的主要内容,如果未能解决你的问题,请参考以下文章

认识Java语言

深入浅出 - Android系统移植与平台开发- Android JNI机制

为啥 Java 被称作是“平台无关的编程语言”?

《Java虚拟机原理图解》5. JVM类加载器机制与类加载过程

虚拟机类加载机制

Java-与平台无关性