相信大家已经了解到Java具有跨平台的特性,可以“一次编译,到处运行”,在Windows下编写的程序,无需任何修改就可以在Linux下运行,这是C和C++很难做到的。

那么,跨平台是怎样实现的呢?这就要谈及Java虚拟机(Java Virtual Machine,简称 JVM)。

JVM也是一个软件,不同的平台有不同的版本。我们编写的Java源码,编译后会生成一种 .class 文件,称为字节码文件。Java虚拟机就是负责将字节码文件翻译成特定平台下的机器码然后运行。也就是说,只要在不同平台上安装对应的JVM,就可以运行字节码文件,运行我们编写的Java程序。

而这个过程中,我们编写的Java程序没有做任何改变,仅仅是通过JVM这一”中间层“,就能在不同平台上运行,真正实现了”一次编译,到处运行“的目的。

JVM是一个”桥梁“,是一个”中间件“,是实现跨平台的关键,Java代码首先被编译成字节码文件,再由JVM将字节码文件翻译成机器语言,从而达到运行Java程序的目的。

注意:编译的结果不是生成机器码,而是生成字节码,字节码不能直接运行,必须通过JVM翻译成机器码才能运行。不同平台下编译生成的字节码是一样的,但是由JVM翻译成的机器码却不一样。

所以,运行Java程序必须有JVM的支持,因为编译的结果不是机器码,必须要经过JVM的再次翻译才能执行。即使你将Java程序打包成可执行文件(例如 .exe),仍然需要JVM的支持。

注意:跨平台的是Java程序,不是JVM。JVM是用C/C++开发的,是编译后的机器码,不能跨平台,不同平台下需要安装不同版本的JVM。



图1  JVM实现跨平台

关于JVM的执行效率

Java 推出的前几年,人们有不同的看法,解释字节码肯定比全速运行机器码慢很多,牺牲性能换来跨平台的优势是否值得?

然而,JVM 有一个选项,可以将使用最频繁的字节码翻译成机器码并保存,这一过程被称为即时编译。这种方式确实很有效,致使微软的 .NET 平台也使用了虚拟机。

现在的及时编译器已经相当出色,甚至成了传统编译器的竞争对手,某些情况下甚至超过了传统编译器,原因是JVM可以监控运行时信息。例如,即时编译器可以监控使用频率高的代码并进行优化,可以消除函数调用(即“内嵌”)。

但是,Java 毕竟有一些C/C++没有的额外的开销,关键应用程序速度较慢。比如Java采用了与平台无关的绘图方式,GUI程序(客户端程序)执行要慢;虚拟机启动也需要时间。

客户端市场的折戟

Java 的GUI库称不上出色,界面不算友好,大部分用户不太习惯;Java 的客户端资源消耗也比较大,大数据量的应用和功能复杂的应用性能堪忧。

更加不能接受的是,微软因自身利益和SUN分家后,Windows 便不再预装JVM了,用户安装你的程序之前,必须要安装JVM并正确设置,你可以要求普通用户安装你的软件,但是你能期望他了解JVM的有关知识并正确安装设置吗?

虽然你可以将JVM集成在你的程序中,自动安装并设置,不让用户干预,但是你希望附带一个比你的程序还要大好多的JVM吗?一个软件这样做或许可以接受,成千上万个软件都这样做,那用户要安装多少个JVM?磁盘空间要浪费多少?

所以,直接投放市场的面向普通用户的客户端程序,用Java开发的很少,大部分Java开发的客户端是给企业内部员工使用,员工领到电脑时,技术部已经给配置好了。如果你希望从事客户端开发,建议学习 C/C++ 和 .NET,它们在Window客户端开发方面有较大的优势。

种种原因,注定了Java客户端不利于推向市场,让普通用户接受。不过话又说回来,客户端开发也不是Java的初衷,Java最初是面向嵌入式的,却随着互联网的兴起而快速成长,在Web开发上大显身手。

系列文章:

Java知多少(上)

Java知多少(中)

Java知多少(下)

转载于:https://www.cnblogs.com/Coda/p/4331432.html

Java知多少(2)虚拟机(JVM)以及跨平台原理相关推荐

  1. Java虚拟机(JVM)以及跨平台原理

    一. Java概述 1. Java语言概述 2. Java虚拟机以及跨平台原理 3. Java的主要就业方向 4. Java的不同版本 5. Java开发环境搭建 6. 第一个Java程序示例 7.  ...

  2. 【转】Java虚拟机(JVM)以及跨平台原理

    版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 关于JVM的执行效率 客户端市场的折戟 那么,跨平台是怎样实现的呢?这就要谈及. 而这个过程中,我们编写的Java程序没有做任何 ...

  3. java xms xmx xmn_JAVA 虚拟机JVM参数调优(1)-Xms -Xmx -Xmn

    随着服务器内存和CPU核数据越来越多,如何充分利用服务器硬件资源?如下图所示JAVA官方公布图一,说明单个CPU服务器垃圾收集造成吞吐量降低1%,30核CPU效率下降20%,查看下图中红色线条. 本文 ...

  4. Java虚拟机(JVM)与Java内存模型(JMM)学习笔记

    Java虚拟机[JVM]与Java内存模型[JMM]学习笔记 Java虚拟机(JVM) 三种JVM JVM 位置 JVM的主要组成部分及其作用 类加载器 双亲委派机制 沙箱安全机制 Java本地接口( ...

  5. java 底层运行_从表面到底层丨Java和JVM的运行原理,现在带给你

    Java,编程语言,被创造于90年代初,在经历了这么多年的风风雨雨,Java已经成长为世界第一的编程语言,根据往期以及目前的数据来看,Java的使用频率为全球第一,即使偶尔会有第二第三的情况,但是这依 ...

  6. Java虚拟机|JVM知识点汇总及简述->性能监控与调优

    性能监控与调优 前言 这里学完整章后选择一到两个工具使用熟练,个人推荐Visual VM和Arthas搭配熟练使用 一.概述 1.性能评价/测试指标 1.1 停顿时间(响应时间) 提交请求和返回该请求 ...

  7. [二]Java虚拟机 jvm内存结构 运行时数据内存 class文件与jvm内存结构的映射 jvm数据类型 虚拟机栈 方法区 堆 含义...

    前言简介 class文件是源代码经过编译后的一种平台中立的格式 里面包含了虚拟机运行所需要的所有信息,相当于 JVM的机器语言 JVM全称是Java Virtual Machine  ,既然是虚拟机, ...

  8. Java虚拟机JVM简单理解

    Java虚拟机JVM的作用: Java源文件(.java)通过编译器编译成.class文件,.class文件通过JVM中的解释器解释成特定机器上的机器代码,从而实现Java语言的跨平台. JVM的体系 ...

  9. JAVA 文件编译执行与虚拟机(JVM)简单介绍

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytpo3 java程序的内存分配 JAVA 文件编译执行与虚拟机(JVM)介绍 ...

  10. [java] 虚拟机(JVM)底层结构详解[转]

    [java] 虚拟机(JVM)底层结构详解[转] 本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 在以前的博客里面,我们介绍了在java领 ...

最新文章

  1. jmeter发送json数据,报405、400错误解决方案
  2. matlab根轨迹法串联超前校正,4.7基于根轨迹法的串联超前校正.ppt
  3. jsp页面,在浏览器端显示时会出现乱码解决方法
  4. 深度学习语义分割理论与实战指南
  5. php插入成功数据不显示,PHP插入数据不成功,什么原因呢?
  6. SQL Server语句大全(增删改查数据、创建表、删除表、修改表)
  7. 普中科技开发板使用说明书_百度大脑加持,米尔科技FZ3深度学习计算卡评测
  8. python数据驱动登录_python之数据驱动ddt操作(方法三)
  9. Thrift编译错误解决方法
  10. [SDUT](3468)广度优先搜索练习之神奇的电梯 ---BFS(图)
  11. php中explode与split的区别
  12. 【音乐可视化】音乐表演可视化软件分析
  13. 苏州珠宝玉石展览教您鉴别方法
  14. 湖南大学14届新生赛--B--bearBabylovessleeping
  15. java公路车的气嘴_5分钟了解运动自行车常见的两种气嘴
  16. 企业微信——定时群机器人布置
  17. 前端开发最基本的3个语言
  18. 备考系统集成项目管理工程师经验
  19. 【MNN学习六】基于Android的MNN编译安装
  20. 【RoCE】Flow Control

热门文章

  1. Python利用Beautiful Soup抓取新闻标题
  2. 智能优化算法:蜉蝣算法 - 附代码
  3. 【LeetCode】【refine 2】题号:*2. 两数相加
  4. 【虚拟机】VMware启动时报错:该虚拟机似乎正在使用中....请按“获取所有权(T)”按钮获取它的所有权
  5. ENVI学习总结(七)——图像融合
  6. 【ArcGIS|空间分析】数据采集处理(全国大学生GIS技能大赛试题)
  7. ios上传闪退 php,iOS应用上架后出现闪退原因浅析
  8. Ubuntu下搭建git服务器步骤
  9. HttpClient 设置不当引发的一次雪崩
  10. python---post请求时其中dict中套有json