JVM定义
JVM它是jre的一部分,也java程序最终运行的地方。jdk默认虚拟机HotSpot。
我们编写的java代码,编译后会生成对应的.class文件,这个文件是字节码文件,紧接着JVM 通过类装载子系统将字节码文件装载到运行时数据区,该区域将字节码内容拆分分别装载到JVM运行时数据区的方法区、堆、栈、本地方法栈和程序计数器 几个部分,最终送到执行引擎子系统配合本地接口然后运行。
JVM结构
JVM由两个子系统和两个组件构成。
子系统:
子系统 | 内容 |
---|---|
类装载子系统(ClassLoader) | 根据给定的全限定类名称装载class文件到运行时数据区的方法区 |
执行引擎子系统(Execution engine) | 包含即时编译器(JITCompiler)和垃圾回收器(Garbage Collector);用于执行class文件中的命令 |
组件:
组件 | 内容 |
---|---|
运行时数据区(Runtime data Area) | jvm的内存,包含方法区、虚拟机栈、本地方法栈、堆、程序计数器 |
本地接口(Native Interface) | 与本地方法库交互,与其他变成语言交互的接口 |
类装载子系统
类的加载是通过双亲委派模型来完成的
类的生命周期:加载、验证、准备、解析、初始化、使用、卸载
双亲委派模型
加载器找到.class文件找到并读取,双亲委派模型描述的是加载器找到.class文件得基本过程。
即加载类时先把请求委托给自己的父类加载器执行,直到顶层的启动类加载器. 父类加载器能够完成加载则成功返回,不能则子类加载器才自己尝试加载.
运行时数据区
JVM在执行Java程序时,会把它管理的内存划分为若干个的区域,每个区域都有自己的用途和创建销毁时间。
区域 | 线程属性 | 内存占比 |
---|---|---|
堆区 | 共享 | 最大 |
虚拟机栈 | 私有 | |
方法区 | 共享 | |
程序计数器 | 私有 | 较小 |