当前位置: 首页 > news >正文

JVM再了解了解

转自

http://www.cnblogs.com/Coda/p/4331432.html

 

相信大家已经了解到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可以监控运行时信息。例如,即时编译器可以监控使用频率高的代码并进行优化,可以消除函数调用(即“内嵌”)。

相关文章:

  • 单测中会用到的类,锁+定时器,等待回调的值返回
  • 进制转换
  • mac 远程桌面提示: 证书或相关链无效
  • [Thinking in JAVA] 关于内部类的一些知识点
  • nginx配置防盗链
  • HDFS开发中的一些问题(逐步补充)
  • 前端之前,先学学C# [误
  • exosip
  • Shell脚本中的export
  • NSBlockOperation下载图片(三)
  • nodejs --- 核心概念
  • LNMP搭建6:Nginx用户认证
  • 搭建DHCP服务器
  • Linux命令篇之cat命令,tac命令和rev命令
  • Eclipse Ant 批量多渠道打包(二)
  • 【剑指offer】让抽象问题具体化
  • ES10 特性的完整指南
  • JavaScript异步流程控制的前世今生
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • SwizzleMethod 黑魔法
  • Tornado学习笔记(1)
  • 从重复到重用
  • 番外篇1:在Windows环境下安装JDK
  • 悄悄地说一个bug
  • 适配mpvue平台的的微信小程序日历组件mpvue-calendar
  • 消息队列系列二(IOT中消息队列的应用)
  • 转载:[译] 内容加速黑科技趣谈
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • ###C语言程序设计-----C语言学习(3)#
  • #LLM入门|Prompt#1.7_文本拓展_Expanding
  • %@ page import=%的用法
  • (k8s中)docker netty OOM问题记录
  • (保姆级教程)Mysql中索引、触发器、存储过程、存储函数的概念、作用,以及如何使用索引、存储过程,代码操作演示
  • (算法)Travel Information Center
  • (学习日记)2024.01.09
  • (源码版)2024美国大学生数学建模E题财产保险的可持续模型详解思路+具体代码季节性时序预测SARIMA天气预测建模
  • (转)Linux NTP配置详解 (Network Time Protocol)
  • (转)Windows2003安全设置/维护
  • (转)编辑寄语:因为爱心,所以美丽
  • .apk文件,IIS不支持下载解决
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET/C# 获取一个正在运行的进程的命令行参数
  • .NET/C# 使窗口永不获得焦点
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .NET使用HttpClient以multipart/form-data形式post上传文件及其相关参数
  • .NET项目中存在多个web.config文件时的加载顺序
  • /usr/lib/mysql/plugin权限_给数据库增加密码策略遇到的权限问题
  • @JsonFormat与@DateTimeFormat注解的使用
  • @WebServiceClient注解,wsdlLocation 可配置
  • [AI]ChatGPT4 与 ChatGPT3.5 区别有多大
  • [BZOJ4010]菜肴制作
  • [Codeforces] number theory (R1600) Part.11
  • [Dxperience.8.*]报表预览控件PrintControl设置
  • [hdu 2896] 病毒侵袭 [ac自动机][病毒特征码匹配]