JVM内存结构
简图:
类加载器和类加载过程
- 类加载器负责从文件系统或网络中加载Class文件,Class文件开头有特定文件标识
- ClassLoader只负责Class文件的加载,至于它是否可以运行,有ExecutionEngine决定
- 加载的类信息防止方法区的内存空间,初类信息外,方法区还存放运行时的常量池信息
- 加载
- 通过类的全类名获取定义此类的二进制字节流
- 将字节流代表的静态纯粹结构转化为方法区的运行时数据结构,在内存生成一个代表这个类的java.lang.Class对象,作为方法区这个类的各种数据的访问入口
- 加载.class的方式
- 从本地文件系统加载
- 2.通过网络加载
- 3.从zip压缩包读取,是jar、war格式的基础
- 4.运行时计算生成,如动态代理技术
- 5.其他文件生成,如JSP
- 6.从专属数据库中提取.class,较少见
- 7.从加密文件中获取,如反编译的保护措施
- 链接
- 验证:主要验证字节码是否符合当期虚拟机要求,保证被家长类的正确性。主要为:文件格式验证、元数据验证、字节码验证、符号引用验证。
- 准备:
- 为类变量分配内存并设置初始值,即零值
- final修饰的static在编译时就分配值了,准备阶段会显示初始化
- 这里不会为示例变量分区初始化,类变量分配在方法区,示例变量随对象分区到堆内存
- 解析
- 将常量池内的符号引用转为直接引用的过程
- 初始化