jvm原理和代码运行的过程
2019-08-26 06:10:17来源:博客园 阅读 ()
jvm原理和代码运行的过程
一次编译,到处运行
java一直宣传的口号是:一次编译,到处运行。那么它如何实现的呢?我们看下图:
graph TD java原程序--javac编译-->java字节码 java字节码-->jvm虚拟机 jvm虚拟机--java解释-->windows机器码 jvm虚拟机--java解释-->linux机器码 windows机器码-->windows执行 linux机器码-->linux执行java程序经过一次编译之后,将java代码编译为字节码也就是class
文件,然后在不同的操作系统上依靠不同的java虚拟机
进行解释,最后再转换为不同平台的机器码,最终得到执行。这样我们是不是可以推演,如果要在mac系统上运行,是不是只需要安装mac java虚拟机
就行了。那么了解了这个基本原理后,我们来看一下,一段程序是如何执行的。
public class HelloWorld {
public static void main(String[] args) {
System.out.print("Hello world");
}
}
这段程序从编译到运行,所经历的过程如下:
graph TD java源代码--class文件-->java字节码 java字节码--加载jvm.cfg文件-->加载配置 加载配置--根据jvm.cfg的配置-->加载jvm.dll文件 加载jvm.dll文件-->初始化jvm 初始化jvm-->获取JNI接口 获取JNI接口--JNI为本地方法他可以直接与操作系统交互-->操作Class文件 操作Class文件-->找到main文件执行jvm基本结构
可能通过上面的描述,大家对JVM运行流程有了一个粗略的认识,那么JVM内部到底是怎么执行一个class文件的呢?
graph TD Class文件-->类加载器 类加载器-->内存空间 内存空间--运行时常量池-->方法区 方法区-->垃圾回收GC 内存空间--对象存储-->java堆 java堆-->垃圾回收GC 内存空间--局部变量表_栈帧_操作数-->java栈 java栈--线程结束自动释放-->线程私有 内存空间--本地方法库_C语言-->本地方法栈 本地方法栈-->线程私有 内存空间--JNI直接操作-->堆外内存jvm内存分类介绍
JVM内存空间包含:方法区、java堆、java栈、本地方法栈。
方法区是各个
线程共享
的区域,存放类信息、常量、静态变量。java堆也是
线程共享
的区域,我们的类的实例就放在这个区域,可以想象你的一个系统会产生很多实例,因此java堆的空间也是最大的。如果java堆空间不足了,程序会抛出OutOfMemoryError异常。java栈是每个
线程私有
的区域,它的生命周期与线程相同,一个线程对应一个java栈,每执行一个方法
就会往栈中压入一个元素,这个元素叫“栈帧”,而栈帧
中包括了方法中的局部变量、用于存放中间状态值的操作栈,如果java栈空间不足了,程序会抛出StackOverflowError异常.
每个帧代表一个方法,Java方法有两种返回方式,return和抛出异常,两种方式都会导致该方法对应的帧出栈和释放内存。
本地方法栈角色和java栈类似,只不过它是用来表示执行本地方法的,本地方法栈存放的方法调用本地方法接口,最终调用本地方法库,实现与操作系统、硬件交互的目的。
PC寄存器(程序计数器),说到这里我们的类已经加载了,实例对象、方法、静态变量都去了自己改去的地方,那么问题来了,程序该怎么执行,哪个方法先执行,哪个方法后执行,这些指令执行的顺序就是PC寄存器在管,它的作用就是控制程序指令的执行顺序。
执行引擎当然就是根据PC寄存器调配的指令顺序,依次执行程序指令。
- 静态变量+常量+类信息+运行时常量池存在方法区中,实例变量存在堆内存中。
- 基本类型的变量和对象的引用变量都是在函数的栈内存中分
原文链接:https://www.cnblogs.com/lori/p/11382042.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:什么是ajax
- 项目经理说这种代码必须重构,我同意了,这代码是写的是有多 2020-06-11
- idea为代码添加标签清除标签 2020-06-11
- JVM常见面试题解析 2020-06-11
- 代码对比工具,我就用这 6 个! 2020-06-10
- 2020最新IDEA插件大集合,一款能帮助你写代码的工具是多么重 2020-06-09
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash