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. BZOJ1757 : Apple 偷苹果

    设$f0[i][j][x][y][S]$表示盗贼位于$(i,j)$,守卫位于$(x,y)$,每棵苹果树苹果数量为$S$,盗贼先手时盗贼还能偷多少苹果. 设$f1[i][j][x][y][S]$表示盗贼 ...

  2. js实现八皇后,回溯法

    八皇后问题:将八个皇后摆在一张8*8的国际象棋棋盘上,使每个皇后都无法吃掉别的皇后,一共有多少种摆法? 两个皇后不能同时在同一行,同一列,和斜对角线的位置上,使用回溯法解决. 从第一行选个位置开始放棋 ...

  3. 浏览器url地址殊字符转义编码

    网址URL中特殊字符转义编码字符    -    URL编码值 空格    -    %20"          -    %22#         -    %23%        -   ...

  4. vue开发(开发环境+项目搭建)

    Vue.js是一套构建用户界面的渐进式框架.与其他重量级框架不同的是,Vue 采用自底向上增量开发的设计.Vue 的核心库只关注视图层,并且非常容易学习,非常容易与其它库或已有项目整合.另一方面,Vu ...

  5. 在win10环境下搭建 solr 开发环境

    在win10环境下搭建 solr 开发环境 2017年05月30日 09:19:32 SegaChen0130 阅读数:1050   在win10环境下搭建 solr 开发环境 安装环境  Windo ...

  6. 怎么用JQUERY设置div背景图片?

    平常,在css里,我们写成 { background:url(....) ; } 如果需要写脚本, 则 function(){ .....; $(....).css("background- ...

  7. truffle unbox react 出坑指南

    最近几天差点就被这鬼东西给逼疯了,truffle init .truffle unbox webpack 不管我怎么运行都是对的,唯独truffle unbox react 不管在哪个windows都 ...

  8. vs2017开发Node.js控制台程序

    1,新建项目  NodejsConsoleApp1 2,在项目的根目录下,添加 sayModule.js 文件 //sayModule.js function Say1Module() { this. ...

  9. [Swift]LeetCode202. 快乐数 | Happy Number

    Write an algorithm to determine if a number is "happy". A happy number is a number defined ...

  10. [Swift]LeetCode222. 完全二叉树的节点个数 | Count Complete Tree Nodes

    Given a complete binary tree, count the number of nodes. Note: Definition of a complete binary tree ...