jvm学习-java代码是怎么运行的

首先一个问题入题:是否知道java和c++在运行方式上的区别?

java需要依赖JRE的运行环境,而c++代码则无需额外的运行时。

那么问题又来了,既然c++的运行方式已经很成熟了,那么为什么java要在虚拟机中运行呢?

  1. 为了实现一次编写,到处运行的目标。
  2. jvm作为一个很好的托管环境,能够代替我们处理一些代码中冗长而且容易出错的部分,比如垃圾回收。

java虚拟机具体是怎样运行java字节码的?

从虚拟机的视角来看,执行java代码首先需要将它编译而成的class文件加载到java虚拟机中。加载后的java类会被存放在方法区中。实际运行时,虚拟机会执行方法区的代码。

在运行过程中,每当调用进入一个java方法,java虚拟机会在当前线程的java方法栈中生成一个栈帧,用以存放局部变量以及字节码的操作数。这个栈帧的大小是提前计算好的,而且java虚拟机不要求栈帧在内存空间里连续分布。

在hotspot里面,上述翻译过程有两种形式:第一种是解释执行,即逐条将字节码翻译成机器码并执行;第二种是即时编译(JIT),即将一个方法包含的所有字节码编译成机器码后再执行。

前者的优势在于无需等待编译,而后者的优势在于实际运行速度更快。HotSpot默认采用混合模式,综合了解释执行和即时编译两者的优点。他会先解释执行字节码,而后将其中反复执行的热点代码以方法为单位进行即时编译。

java虚拟机的运行效率究竟怎么样?

即时编译是建立在程序符合二八定律的假设上,也就是百分之二十的代码占据了百分之八十的计算资源。

对于占据大部分的不常用的代码,我们无需好分时间将其编译成机器码,而是采用解释执行的方式运行;另一方面,对于仅占据小部分的热点代码,我们则可以将其编译为机器码,以达到理想的运行速度。

理论上讲,即时编译后的java程序的执行效率,是可能超过c++的。这是因为与静态编译相比,即时编译拥有程序的运行时信息,并且能够根据这个信息做出相应的优化。举个栗子:对于一个虚方法的调用,尽管有很多个目标方法,但在实际运行过程中他可能只调用其中一个。这个信息可以被即时编译器所利用,来规避虚方法调用的开销。

原文地址:https://www.cnblogs.com/xxxuwentao/p/9341969.html

时间: 2024-10-09 23:42:50

jvm学习-java代码是怎么运行的的相关文章

01 Java 代码是怎么运行的

Java代码运行的方式 1:在开发工具中运行 2:双击 jar 文件运行 3:在命令行中运行 4:在网页中运行 上述运行方式都离不开 JRE,也就是 Java 运行时环境.实际上 JRE 仅包含运行 Java 程序的必须组件,包括 Java 虚拟机以及 Java 核心类库等.Java 程序员经常接触到的 JDK 同样包含了 JRE,并且还附带了一系列开发和诊断工具. 为什么 Java 要在虚拟机里运行 Java 是一门高级程序语言,语法复杂,抽象程度高,因此直接在硬件上运行并不现实.所以,在 J

Java代码是怎么运行的

Java代码执行步骤 编译 Java文件通过JVM的编译器编译成字节码文件,有了字节码,JVM的类加载器就开始加载字节码文件. 解释器 解释器会将字节码转换成汇编指令,然后在转换成CPU可以识别的机器指令(下图是汇编指令转成机器码的案例).解释器是软件实现的,他将字节码转换成汇编指令,可以实现同一份Java字节码在不同的硬件上运行,而将汇编指令转换成机器指令由硬件直接实现,所以他的速度会更快.JVM为了提升运行效率,会将某些热点代码,一次全部编译成机器指令再执行.也就是和解释执行对应的即时编译,

Java学习---Java代码编写规范

编码规范 1 前言为确保系统源程序可读性,从而增强系统可维护性,java编程人员应具有基本类似的编程风格,兹制定下述Java编程规范,以规范系统Java部分编程.系统继承的其它资源中的源程序也应按此规范作相应修改. 2 适用范围本文档将作为java编程人员软件开发的编程格式规范.在项目Java部分的编码.测试及维护过程中,要求严格遵守. 3 命名规范定义这个规范的目的是让项目中所有的文档都看起来像一个人写的,增加可读性,减少项目组中因为换人而带来的损失. 3.1 Package 的命名Packa

JVM学习笔记(一)------基本结构

从Java平台的逻辑结构上来看,我们能够从下图来了解JVM: 从上图能清晰看到Java平台包括的各个逻辑模块,也能了解到JDK与JRE的差别 对于JVM自身的物理结构,我们能够从下图俯视一下: 对于JVM的学习,在我看来这么几个部分最重要: Java代码编译和运行的整个过程 JVM内存管理及垃圾回收机制 以下将这两个部分进行具体学习 JVM学习笔记(一)------基本结构,布布扣,bubuko.com

java和javac编译运行java程序

目录 目录 前言 编译命令介绍 javac java 代码编译与运行 java类发现规则 分离class和java文件 参考链接 前言 给自己定了一个月学习JVM虚拟机的计划,不管有没有卵用,学点新东西总是好的. 但是在学习过程中,我想在命令行测试一些JVM参数的时候,发现自己脱离了IDE,竟然无法直接编译java程序!! 我的原则不能抱怨太多,像个Loser,不会的就花时间补回来. 下面,主要是总结一些如何在命令行中编译java程序.主要是想记录总结一下java的类发现原则. 编译命令介绍 其

java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessController的checkPerssiom方法,访问控制器AccessController的栈检查机制又遍历整个 PerssiomCollection来判断具体拥有什么权限一旦发现栈中一个权限不允许的时候抛出异常否则简单的返回,这个过程实际上比我的描述要复杂 得多,这里我只是简单的一句带过,因为这

JVM学习笔记:Java运行时数据区域

JVM执行Java程序的过程中,会使用到各种数据区域,这些区域有各自的用途.创建和销毁时间.根据<Java虚拟机规范>,JVM包括下列几个运行时数据区域,如下图所示: 其中红色部分是线程私有的,即每个线程各自都有自己的一份.绿色部分是各个线程共享的. 1.PC寄存器(The pc Register) (1)每一个Java线程都有一个PC寄存器. (2)PC寄存器是用于存储每个线程下一步将执行的JVM指令,如该方法为native的,则PC寄存器中不存储任何信息. (3)此内存区域是唯一一个在JV

JVM学习笔记(二)------Java代码编译和执行的整个过程【转】

转自:http://blog.csdn.net/cutesource/article/details/5904542 版权声明:本文为博主原创文章,未经博主允许不得转载. Java代码编译是由Java源码编译器来完成,流程图如下所示: Java字节码的执行是由JVM执行引擎来完成,流程图如下所示: Java代码编译和执行的整个过程包含了以下三个重要的机制: Java源码编译机制 类加载机制 类执行机制 Java源码编译机制 Java 源码编译由以下三个过程组成: 分析和输入到符号表 注解处理 语

JVM学习(4)——全面总结Java的GC算法和回收机制---转载自http://www.cnblogs.com/kubixuesheng/p/5208647.html

俗话说,自己写的代码,6个月后也是别人的代码--复习!复习!复习!涉及到的知识点总结如下: 一些JVM的跟踪参数的设置 Java堆的分配参数 -Xmx 和 –Xms 应该保持一个什么关系,可以让系统的性能尽可能的好呢?是不是虚拟机内存越大越好? Java 7之前和Java 8的堆内存结构 Java栈的分配参数 GC算法思想介绍 –GC ROOT可达性算法 –标记清除 –标记压缩 –复制算法 可触及性含义和在Java中的体现 finalize方法理解 Java的强引用,软引用,弱引用,虚引用 GC