zoukankan      html  css  js  c++  java
  • Java 代码是怎么运行的

    1.Java代码有很多 不同的运行方式

      1)可以在开发工具中运行

      2)可以双击执行jar文件运行,

      3)也可以在命令行中运行

      4)甚至可以在网页中运行

      这些执行方式都离不开JRE ,也就是Java的运行环境。JRE仅包含运行Java程序的必须组件,包括Java虚拟机以及Java核心类库。Java程序员经常接触到的JDK同样包含JRE,并且还附带了一些开发、诊断工具

    2.为什么Java要在虚拟机里运行

      Java作为一门高级程序语言,他的语法非常复杂,抽象程度也很高。直接在硬件上运行这种复杂的程序并不现实。所以在运行Java程序之前,我们需要进行一番转化。

      这个转化具体是怎么操作的呢?

      当前的主流思想,就是设计一个面向Java语言特性的虚拟机,并通过编译器将Java程序转换成哎虚拟机所能识别的指令序列,也称为Java字节码。(Java字节码指令的操作码opcode被固定为一个字节)。

      Java =写的helloword程序编译而成 的字节码。都是一个个字节组成的

    # 最左列是偏移;中间列是给虚拟机读的机器码;最右列是给人读的代码
    0x00:  b2 00 02         getstatic java.lang.System.out
    0x03:  12 03            ldc "Hello, World!"
    0x05:  b6 00 04         invokevirtual java.io.PrintStream.println
    0x08:  b1               return

      Java 虚拟机可以由硬件实现 [1],但更为常见的是在各个现有平台(如windows、liunx)上提供软件实现。这样做的意义就是,一旦一个程序被转换成Java 字节码,那么他便可以在不同平台上的虚拟机实现运行。(一次编写,到处运行)。

      虚拟机的另外一个好处是他带来了一个托管环境(Managed Runtime)。他能够代替我们处理一些代码中的冗长而容易出错的部分。其中最广为人知的内存管理和垃圾回收。除此之外还提供了数组越界、动态类型、安全权限等动态检测,是我们免于书写这些无关业务逻辑的代码。

     3.Java虚拟机具体是怎样运行Java字节码的

      执行Java代码首先需要将他编译成class文件加载到Java虚拟机中。加载后的Java类会被存放于方法区(method area).实际运行时,虚拟机会执行方法区内的代码。Java虚拟机同样会在内存中划分出堆和栈来存储运行时数据。

      

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

      当退出当前执行的方法时,不管是正常返回还是异常返回,虚拟机均会弹出当前线程的当前栈帧,并将之舍去。

      Java字节码是无法执行的。因此,Java虚拟机需要将字节码翻译成机器码。在hotspot里面,有两种编译方式:第一种是解释执行,逐条将字节码翻译成机器码并执行;第二种是即时编译,讲一个方法中包含的所有字节码编译成机器码后执行。

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

      4.Java虚拟机的运行效率究竟如何

        HotSpot采用了多种技术来提升启动性能以及峰值性能,即时编译便是其中最终要的技术之一。即时编译建立在程序符合二八定律的假设上,也即是百分之二十的代码占据了百分之八十的计算机资源。

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

    5.总结

      之所以要在虚拟机中运行,是他提供了可移植性。一旦Java代码被编译成Java字节码,变可以在不同平台上运行,虚拟机还提供了一个代码托管环境,代替我们处理部分冗长的代而且容易出错的事务。

      Java虚拟机将运行时内存区域划分为五个部分,分别为方法区、堆、pc寄存器、Java方法栈和本地方法栈。Java程序编译而成的calss文件,需要先加载至方法区中,Java虚拟机才能运行。

      为了提高效率,标准jdk中的hotspot虚拟机采用的是一种混合执行的策略。他会解释执行Java字节码,然后会将其中反复执行的热点代码,以方法为单位进行即时编译,编译成机器码后直接运行在底层硬件之上。

  • 相关阅读:
    开启text汇聚排序
    sshpass安装使用
    pinpoint初始化hbase脚本报错
    ORA-19606: Cannot copy or restore to snapshot control file
    standby_file_management参数为MANUAL导致添加数据文件错误
    dataguard从库移动数据文件
    redis恢复(aof)
    redis集群部署+节点端口修改+数据恢复
    oracle传输表空间相关
    dataguard主库删除归档日志后从库恢复的方法
  • 原文地址:https://www.cnblogs.com/panda777/p/10540435.html
Copyright © 2011-2022 走看看