Java 文件加载到内存的过程:
- Java 文件经过编译器编译生成Class文件
- Class 文件通过类加载器ClassLoader 加载到JVM内存中
- Java JVM 内存被划分为几个部分:程序计数器、虚拟机栈、本地方法栈、堆、方法区
1.程序计数器;java 程序是多线程的,当某个线程被挂起时需要记录当前线程执行到的位置,方便该线程被重新运行时知道从哪条指令开始执行,这就是程序计数器的作用。
支持的操作:分支操作、循环操作、跳转、异常处理等。
2.虚拟机栈:用来描述java 方法执行时的内存模型,是一个后入先出的数据结构(LIFO),每执行一个方法时会创建一个栈帧插入到虚拟机栈中,方法执行完成,该栈帧则从虚拟机栈中弹出。
栈帧:由四部分构成
- 局部变量表-变量值的存储空间,用来存储方法的传参以及方法内生命的局部变量
- 操作数栈
- 动态链接- 该方法调用其他方法时需要将方法区中的符号引用转为真正的引用
- 返回地址-方法执行完毕后需要返回到方法被调用时的位置
3.本地方法栈,和虚拟机栈类似,只不过调用的方法都是本地方法即native方法。
4.堆
存放对象实例的区域,堆中内存分为新生代(Eden, Survivor区),老年代,不同的区域存放具有 不同生命周期的对象。这样可以根据不同的区域使用不同的垃圾回收算法,从而更具有针对性,进而提高垃圾回收效率。
5.方法区
存储已经被 JVM 加载的类信息(版本、字段、方法、接口)、常量、静态变量、即时编译器编译后 的代码和数据 。