前言
在找资料的过程中,发现大多数讲jvm的文章都比较庞杂,对于只想在短时间内了解jvm的组成部分以及工作流程的人不是很友好,所以将自己的理解总结出来方便自己和大家。
JVM组成部分
- 类加载器(Class Loader);
- 运行时数据区(Runtime Data Area);
- 执行引擎(Execution Engine);
- 本地库接口(Native Interface);
运行时数据区包括的就是我们熟悉的堆栈等。
工作流程
Java代码在JVM中被类加载器加载为字节码后,被运行时数据区加载到内存中(即被分配了内存空间),而这时的字节码是不能直接被操作系统执行的,还需要通过执行引擎将字节码转化成底层系统指令,再交由CPU去执行,而本地库接口就是在转化过程中发挥作用的。
运行时数据区
分为五部分:堆、方法区、Java虚拟机栈、本地方法栈、程序计数器。
Java虚拟机栈:当有一个方法被调用时,代表这个方法的栈帧入栈;当这个方法返回时,其栈帧出栈。栈帧中存储有(方法的)局部变量(方法内的变量)表、操作数栈、动态链接(堆中对象的引用)、方法出口等信息。它的生命周期与当前运行线程相同。
堆:存对象以及对象内属性。
方法区:存类信息、常量、静态属性等。
方法区和堆是所有线程共享的内存区域;而java虚拟机栈、本地方法栈和程序计数器是
运行时线程私有的内存区域。
每个程序的运行都建立在着其内部若干线程的运行之上。
栈负责给单个线程的运行所需元素分配内存空间,它私有于当前运行的这个线程。
而堆所负责的是整个程序的运行,它和方法区是被所有线程共享的。
程序计数器:当前线程所执⾏的字节码的⾏号指示器,字节码解析器 的⼯作是通过改变这个计数器的值,来选取下⼀条需要执⾏的字节码指令,分⽀、循环、跳转、异常处理、线程恢复等基础功能,都需要依赖这个计数器来完成;
本地方法栈:与虚拟机栈的作⽤是⼀样的,只不过虚拟机栈是服务 java ⽅法的,⽽本地⽅法栈是为虚拟机调⽤ Native ⽅法服务的;