java程序是怎么执行的
埋坑待填, 这一篇是总览,然后细化各个部分。
java程序的运行过程是开发人员进行代码的开发,然后通过编译器编译成java字节码文件,java虚拟机(jvm)把字节码文件加载进来运行,jvm是运行在操作系统之上。
所以我们会遇到什么疑惑呢?
- 1.java虚拟机(jvm)是什么
- 2.java代码怎么编译成字节码文件
- 3.jvm加载字节码过程
- 4.Java对象内存布局
- 5.jvm的运行过程是怎么用的
1.java虚拟机(jvm)是什么
虚拟机
就是一台虚拟的计算机,他是一款软件,用来执行一系列虚拟计算机指令。分为系统虚拟机和程序虚拟机
- 系统虚拟机: 是对物理计算机的仿真,提供一个可以运行完整操作系统的软件平台,如VMware
- 程序虚拟机: 专门为单个计算机程序而设计,典型的代表就是java虚拟机。
程序运行在虚拟机中,运行效果受限于虚拟的提供的资源。
java虚拟机
java 虚拟机(java viture machine)是一台执行字节码的虚拟计算机,字节码是二进制的数据形式,他拥有独立的运行机制,只要符合虚拟机的规范,其他语言也是可以通过编译器编译成可用于java虚拟机上运行的字节码文件,例如JPython,scala,JRuby等。
java虚拟机优点
- 一次编译到处运行
- 自动内存管理
- 自动垃圾回收功能
java字节码是运行在虚拟机里的,而虚拟机是运行在操作系统里面的,所以实际上java语言的一次编译到处运行是指的字节码文件,而虚拟机还是要安装成适配linux或者windows系统的,所以我们在安装jdk的时候会有windos和linux版。
HotSpot 虚拟机
目前市面上的高性能虚拟机的代表作之一
它采用解释器和即时编译器并存的架构,目前运行性能和C++的效力可以媲美。目前还有的虚拟机有Sun Class, IBM J9 VM, Apache HarMony, Microsoft JVM等等。
java虚拟机的架构模型
指令集架构又基于栈和基于寄存器两种方式,而java编译器输入的指令是基于栈的指令集架构.
-
基于栈架构的特点
1.设计简单,适用于资源受限的系统
2.不跟硬件系统耦合,移植性更高
3.指令集少 -
基于寄存器的架构
1.性能高,执行速度块
2.任务执行指令少
3.不同平台指令集不一样
jvm的生命周期
java虚拟机的是随着执行java程序来运行的,也就是说开发完成一个程序运行起来就是jvm在运行,他负责对程序字节码文件的加载,对象内存分配,等等。jvm的生命周期分为三个阶段。
- 启动
java虚拟机的启动是通过引导类加载器加载一个初始类来实现的,不同的虚拟机有不同的初始类实现。 - 运行
虚拟机的运行就是执行我们写的代码的逻辑,分配内存等。 - 退出
虚拟机退出一般就是程序正常结束,程序异常没处理,操作系统异常等。
2.java代码怎么编译成字节码文件
java设计者在设计之初有意设计了《java语言规范》和《java虚拟机规范》。而字节码文件(.class文件)是java虚拟机中比较重要的部分,它规定了特定的文件结构等信息,这样的话任何语言都可以设计出一个编译器编译成符合字节码规范的字节码文件。而java语言规范约束了java语言的开发规范,即语法,关键词,流程控制等等。我们在开发完成符合java语言规范的文件后,通过java编译器编译成字节码文件。
3.jvm加载字节码过程
java代码编译成字节码后,由jvm加载并执行,那么jvm加载的过程是由类加载子系统来执行的。java虚拟机把描述类的数据从Class文件加载到内存,并对数据进行校验,转换解析和初始化,最后形成可以被虚拟机直接使用的java类型。
4.Java内存区域和对象布局
java 虚拟机规范规划的内存区域为程序计数器,虚拟机栈,本地方法栈,堆,元空间等。对象在堆中又分为对象头,实例数据,和对齐填充。