Java Virtual Machine  官方介绍

Java虚拟机规范官方文档
https://docs.oracle.com/javase/specs/index.html
其中以java8的为
https://docs.oracle.com/javase/specs/jvms/se8/html/index.html
看下官方的介绍的一节
 The Java Virtual Machine
Java虚拟机是Java平台的基石。是java实现硬件和操作系统的独立性(也就是无关性),生成极小体积的编译代码,以及保护用户免受恶意程序攻击的的关键技术组成部分。

Java虚拟机是一种抽象计算机器。像真正的计算机一样,它有一个指令集以及在运行时各种内存区域。
使用虚拟机实现编程语言是相当普遍的;
最著名的虚拟机可能是 P-Code machine of UCSD Pascal.

Java虚拟机的第一个原型实现是在Sun Microsystems inc.完成的,它在手持设备上仿真实现了Java虚拟机指令集,该设备类似于现在的个人数字助理(PDA)。Oracle现在已经将许多java虚拟机实现应用于 移动设备 pc 服务器等领域,但是Java虚拟机不局限于任何特定的实现技术、主机硬件或主机操作系统。也不局限于特定的代码执行方式,虽然不强求使用解释器来执行程序,但是也可以通过将它的指令集编译成一个实际的CPU来实现。它也可以在微代码microcode实现,也可以直接在CPU中实现。

Java虚拟机对Java编程语言一无所知,只知道一种特定的二进制格式,class文件格式。一个class文件包含Java虚拟机指令集(或者称之为字节码bytecode)和符号表,以及其他辅助信息。

基于安全方面的考虑,Java虚拟机在class文件中施加了许多强制性的语法和结构化约束,凡是能用class文件正确表达出来的编程语言,都可以放在Java虚拟机里面执行。由于它是一个通用的、机器无关的执行平台,所以其他语言的实现者都可以考虑将Java虚拟机作为那些语言的交付媒介。
 
 
 

java的组成部分

 
  • Java语言规范
  • Java 应用程序编程接口 API
  • Java class文件格式规范
  • Java虚拟机

java语言规范
java语言规范决定了你要怎么书写你的源代码
也就是java的语法句法词法结构组成,数据类型长度等,对于java语言本身的描述
比如主函数需要时public static void main(String[] args){ 为什么使用public而不是common表示公用?这就是java语言规范的作用
 
java应用程序编程接口
Java应用程序API 也就是java设计者提供的基本的功能方法,比如访系统资源 
API之主要目的是提供应用程序与开发人员以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
提供API所定义的功能的软件称作此API的实现。API是一种接口,故而是一种抽象。
应用程序接口为:"电脑操作系统(Operating system)’或‘程序库’提供给应用程序调用使用的代码
其实所有的功能也都是依赖操作系统本身的,比如读取文件,获取文件的属性
如果一个操作系统,本身就没有网络通信的功能,你是不可能在上面完成网络通信程序的开发的
 
Java class文件格式规范
编译后被Java虚拟机执行的一种二进制文件格式
这是一种统一的明确的格式 一般以文件的形式存储
其实就是java虚拟机的"机器语言"
 
Java虚拟机
读取class文件,解析class文件并执行,实际运行java的机器
一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。
 
编写任何一个程序你都会用到这四个技术领域

无关与相关的辩证关系

 
JVM是平台相关的,不同的平台有不同的虚拟机
但是她在不同的平台上提供统一一致的JVM虚拟指令集,对具体的平台进行抽象封装
不管运行在何种平台,他们提供一致性的操作与访问形式
从JVM本身的平台相关性,转变成为JAVA语言的平台无关性
 
class文件是源代码编译后的  平台无关的  二进制文件格式,
不依赖于特定的硬件与操作系统表示形式
是JVM可以识别执行的语言,相当于JVM的机器语言
也就是说,不管何种语言,如果一旦能够编译成为符合规范的class文件格式
就能够被JVM进行执行! 这就相当于实现了语言无关性
 
可以说,java设计者的野心很大, class文件 与JVM的结合,语言无关加上平台无关
 
 
 

java语言实现与运行原理


再回头看下java技术体系,可以很清晰的看得出来
java的语言实现与运行原理
Java语言规范 和 Java 应用程序编程接口 API 提供了使用Java语言解决问题的方式
Java class文件格式规范 和Java虚拟机 则约定了Java的运行原理

class文件是对源代码的编译,不仅仅具有语言无关性的好处
源代码是以对人友好的方式,class文件是机器友好的,通过对原始文件进行特殊的处理与转换,能够提高运行的性能,将一部分工作前置
class文件既然是对于源代码的转换描述
自然是会涉及到java中的各种数据类型,方法调用,常量等等的描述与表示
JVM既然是解析class文件进行解析执行,自然是需要解析class文件,并且能够读取验证文件的格式以及语法格式,然后进行装载运行
 
所以说想要了解Java的运行原理
最基本的两个部分就是class文件的结构组成以及JVM的运行区域内存的管理
Java语法中所有的一切都要能够表示出来
比如数据类型 引用类型还是基本类型 字段属性 方法 公有私有 静态 非静态 如何表示描述
以及必要的信息,比如当前对象的this等等
某种程度上来说 class文件就是源代码针对于java虚拟机的"注解版" ,将你知道的语法表示出来
然后还有潜在的隐藏的信息,比如父类信息等
 
对于一个已经定义好的class文件,JVM需要进行一系列严格的验证
因为一个class文件可能不是由一个标准的编译器生成的也可能被别人恶意篡改过
所以JVM必须验证
验证之后还需要进行装载把数据信息装载到内存中,然后进行初始化等等
这就是JVM涉及到的部分
所以说想要弄明白java的运行原理需要了解清楚class文件的结构以及JVM的运行内存划分
 

使用javap查看编译后的文件

 
源代码
 
javap -v HelloWolrd.class  查看
 

上图中的信息不必较真,我也是随便标注了个别比较好辨别的点
但是你完全可以发现
class文件对于源文件的完整表述,类信息,字段信息 方法信息 涉及到的常量与其他类的调用等等
class文件是一张巨大的表
信息是单独存放的,可以把行号#XXX 理解成地址,
如下图所示,从头不断地根据地址信息串联起来,知道最终的叶子数据信息,形成一张巨大的信息表
 
 
比如
 

 
 
再次重申,这些就相当于JVM的机器语言了,有数据,有指令,JVM要做的就是解析执行了
当然,是一项很复杂的工作
 
 
 
另外javap还有很多其他命令
 
 
 
 
 
 
 
 

[零] Java 语言运行原理 JVM原理浅析 入门了解简介 Java语言组成部分 javap命令使用的更多相关文章

  1. Java虚拟机运行时栈帧结构--《深入理解Java虚拟机》学习笔记及个人理解(二)

    Java虚拟机运行时栈帧结构(周志明书上P237页) 栈帧是什么? 栈帧是一种数据结构,用于虚拟机进行方法的调用和执行. 栈帧是虚拟机栈的栈元素,也就是入栈和出栈的一个单元. 2018.1.2更新(在 ...

  2. java使用jconsole查看java程序运行(jmx原理)

    在JVM启动参数上加上     java -Dcom.sun.management.jmxremote.port=8999     -Dcom.sun.management.jmxremote.aut ...

  3. Java 程序运行过程中的内存分析

    作为 java 程序员,都应该知道 Java 程序运行在 JVM(Java Virtual Machine,Java 虚拟机)上,可以把 JVM 理解成 Java 程序和操作系统之间的桥梁,JVM 实 ...

  4. java后端知识点梳理——JVM

    可以先看看我的深入理解java虚拟机笔记 深入理解java虚拟机笔记Chapter2 深入理解java虚拟机笔记Chapter3-垃圾收集器 深入理解java虚拟机笔记Chapter3-内存分配策略 ...

  5. 谈谈java的运行机制

    1.高级语言的运行机制 我们编程都是用的高级语言(写汇编和机器语言的大牛们除外),计算机不能直接理解高级语言,只能理解和运行机器语言,所以必须要把高级语言翻译成机器语言,计算机才能运行高级语言所编写的 ...

  6. java的运行机制(基础)

    1:高级语言的运行机制: 我们编程都是用的高级语言(写汇编和机器语言的大牛们除外),计算机不能直接理解高级语言,只能理解和运行机器语言,所以必须要把高级语言翻译成机器语言,计算机才能运行高级语言所编写 ...

  7. java 程序运行过程 简介

    这里的Java程序运行过程,是指我们编译好代码之后,在命令行开始执行java xxx命令,到java程序开始执行起来的这一过程,我们称其为运行时. 第一步,操作系统解析我们输入的java xxx命令, ...

  8. Java内存管理-初始JVM和JVM启动流程(二)

    勿在流沙住高台,出来混迟早要还的. 做一个积极的人 编码.改bug.提升自己 我有一个乐园,面向编程,春暖花开! 上一篇分享了什么是程序,以及Java程序运行的三个阶段.也顺便提到了Java中比较重要 ...

  9. JVM笔记-Java技术体系与JVM概述

    1. 简述 Java 不仅仅是一门编程语言,还是一个由一系列计算机软件和规范组成的技术体系. Java 的广告词为 "一次编写,到处运行",之所以能够做到"跨平台&quo ...

随机推荐

  1. json字符串的拼接

    关于json字符串的解析与拼接,第一次接触,留下个笔记了.......解析,是改的代码,拼接是纯的,解析就不说了,笔记一下拼接了 关于解析主要分三部分,一个是第一层处理,一个是第二层处理,一个是进行& ...

  2. TortoiseGit的ssh key和Git的ssh key

    情景模拟: 你使用Git+TortoiseGit对项目进行版本控制,本地库(自己电脑建立的.git)与远程库(如GitLab上建立)通信需要使用ssh验证,你用git生成公钥并保存到了Gitlab上, ...

  3. LeetCode 26 Remove Duplicates from Sorted Array [Array/std::distance/std::unique] <c++>

    LeetCode 26 Remove Duplicates from Sorted Array [Array/std::distance/std::unique] <c++> 给出排序好的 ...

  4. spring-cloud-Zuul学习(三)【中级篇】--Filter链 工作原理与Zuul原生Filter【重新定义spring cloud实践】

    这里开始记录zuul中级进阶内容.前面说过了,zuul主要是一层一层的Filter过滤器组成,并且Zuul的逻辑引擎与Filter可用其他基于JVM的语言编写,比如:Groovy. 工作原理 Zuul ...

  5. 2018-2019-20175324实验一《Java开发环境的熟悉》实验报告

    2018-2019-20175324实验一<Java开发环境的熟悉>实验报告   实验内容与结果 一.Java开发环境的熟悉-1 1.实验要求: 0 参考实验要求 1 建立“自己学号exp ...

  6. (一) sublime安装和使用

    1  下载安装sublime 可以破解也可以不破解 2 html基础架子自动生成插件Emmet的安装 3 Emmet 安装失败解决 4 快捷键设置和汇总 4 其他sublime插件汇总

  7. H5混合开发问题总结

    1.This application is modifying the autolayout engine from a background thread, which can lead to en ...

  8. [译文]Domain Driven Design Reference(七)—— 大型战略设计结构

    本书是Eric Evans对他自己写的<领域驱动设计-软件核心复杂性应对之道>的一本字典式的参考书,可用于快速查找<领域驱动设计>中的诸多概念及其简明解释. 上周末电脑硬盘文件 ...

  9. 依赖注入[7]: .NET Core DI框架[服务注册]

    包含服务注册信息的IServiceCollection对象最终被用来创建作为DI容器的IServiceProvider对象.服务注册就是创建出现相应的ServiceDescriptor对象并将其添加到 ...

  10. Java提高篇(二):IO字节流、字符流和处理流

    在我们的Java语言当中,通常会有对文件进行读写,因此我们引入java的IO类来进行文件的读写. 一.字节流 下面是一个字节流的实例: import java.io.*; public class I ...