JVM结构概述
- 字节码文件通过类加载器进行加载
- 类加载器又分成了三个环节,加载,链接,初始化
- 加载器又可以分成多种类型,如:引导类加载器,扩展类加载器,系统类加载器
- 链接又分为验证,准备,解析这个三个环节
- 初始化涉及到静态变量的显式初始化
- 运行时数据区,包括方法区,堆,栈,PC计数器,本地方法区
- PC计数器和栈区,每个线程一份
- 我们平时说的栈就是指的虚拟机栈,每个栈里面一个一个的结构又叫栈帧,栈帧里面又包含了更微妙的结构:LV局部变量表,OS操作树栈,DL动态链接,RA方法返回地址
- 本地方法栈,专门用于本地方法api的调用
- 堆,用来存储java创建的对象,算是内存中最大的一块空间了,GC终点关注对象
- 方法区主要是用来存放一些方法信息,一些常量等
- 执行引擎包括解释器,即时编译器,和垃圾回收
- 注意:方法区只有HotSpot虚拟机有,J9,JRockit都没有
类加载子系统
- 类加载器子系统负责从文件系统或者网络中加载Class文件,class文件在文件开头有特定的文件标识。
- ClassLoader只负责class文件的加载,至于它是否可以运行,则由Execution Engine决定。
- 加载的类信息存放于一块称为方法区的内存空间。除了类的信息外,方法区中还会存放运行时常量池信息,可能还包括字符串字面量和数字常量(这部分常量信息是Class文件中常量池部分的内存映射)
IDEA 中安装
JClassLib Bytecode viewer
插件,可以很方便的看字节码。