JVM是什么
JDK(JAVA开发工具包)= JRE + 开发工具(javac) + 类库
JRE(JAVA运行时环境)= JVM + 核心类库 + 支持文件
JVM即JAVA虚拟机,它可以将字节码文件解释生成当前操作系统可执行的文件,是Java程序跨平台运行的关键。
JVM的组成
JVM主要有三大组成部分 类加载子系统、运行时数据区和执行引擎
类加载子系统
负责从文件系统或网络中加载Java类文件,并将其转换为可执行的Java代码。
执行引擎
通过解释器或即时编译器,将字节码文件转变为机器码,根据程序计数器的记录逐条执行指令,并执行相应的操作。
运行时数据区
运行时数据区由堆、方法区、虚拟机栈、本地方法栈、程序计数器组成
堆
1、存放了所有new出来的对象以及字符串常量
2、是jvm中最大的一块内存区域,可以通过-Xms(最小值)和-Xmx(最大值)参数设置大小(可动态调整)
3、作为垃圾回收的主要空间,由于现在的垃圾回收器多采用分代收集算法,因而堆被划分为新生代和老年代,新生代又被划分为Eden区和两个Survivor区。
方法区
存放了常量、静态变量以及类信息(类名、方法名、字段名等)
虚拟机栈
1、每个线程都会开辟一个虚拟机栈,每个方法都会在栈中压入一个栈帧
2、栈帧由局部变量表、操作栈、动态链接、方法出口
动态链接记录了当前方法依赖的类库在内存中的地址,通过动态链接可以很方便得找到对应的类信息
程序计数器
记录了当前正在执行的指令的地址,同时他还会指向下一条指令
本地方法栈
是由native修饰的本地方法使用的内存区域
本人理解的JVM工作流程:
在java程序运行时,类加载子系统会将需要的字节码文件加载到方法区中,执行引擎通过解释或者即时编译执行代码,在执行方法时,会在虚拟机栈中压入对应栈帧,通过操作数栈对局部变量进行操作,通过动态链接得到依赖的其他方法,执行完成后,程序计数器通过方法出口获取下一步要执行的指令地址,方法出栈,执行引擎继续执行。
上述执行流程是本人根据各大组件功能所推导出来的,如有错误,还请指教