##Java 程序的执行过程
Java文件 -> 编译器 -> 字节码 -> JVM ->机器码JVM、JRE、JDK 的关系JVM只是一个翻译,把class翻译成机器识别的机器码JRE java运行环境JDK java工具, javac编译代码,java jar启动项目,javap反编译
##JVM的内存区域:
运行时数据区的定义:JVM在运行java程序时会把它的内存划分为不同的数据区域
- JVM的内存分为: 堆 栈 虚拟机栈 本地方法栈
- 按照JVM与线程的关系可划分为:
线程私有区域:一个线程拥有独立的一块区域
线程共享区域:被所有线程共享,只有一份 - 直接内存:没有被JVM虚拟化的操作系统上的其他内存
##JVM方法的运行与虚拟机栈
虚拟机栈
栈的数据结构: 先进后出(FILO)的数据结构
虚拟机栈的作用: 在JVM中 存贮当前线程运行方法所需的数据、指令和返回地址
虚拟机栈是基于线程的: 哪怕只有一个main()方法运行,也是医线程的方式运行的。在线程的声明周期中,参与计算的数据会频繁的入栈和出栈,栈的声明周期和线程是一样的
栈帧:每一个方法调用时都会创建一个栈帧,并入栈,方法结束,则出栈
栈帧大概包含四个区域: 局部变量表,操作数栈, 返回地址和动态连接
程序计数器
较小的内存空间,当前线程执行的字节码的行号指示器;
各线程之间独立存储,互不影响。
本地方法栈
服务对象为native方法的,HotSpot 直接将本地方法栈和虚拟机栈合二为一
方法区
方法区(Method Area)是可供各条线程共享的运行时内存区域。它存储了每一个类的结构信息,例如运行时常量池(Runtime Constant Pool) 字段和方法数据、构造函数和普通方法的字节码内容、还包括一些在类、实例、接口初始化时用到的特殊方法
元空间 (本地内存)
方法区与堆空间类似,也是一个共享内存区,所以方法区是线程共享的。假如两个线程都试图访问方法区中的同一个类信息,而这个类还没有装入 JVM,那么此时就只允许一个线程去加载它,另一个线程必须等待。
运行时常量池
运行时常量池是方法区的一部分。
堆
堆是 JVM 上最大的内存区域,我们申请的几乎所有的对象,都是在这里存储的。我们常说的垃圾回收,操作的对象就是堆。
直接内存(堆外内存)
当JVM运行时会在操作系统中申请大块的堆内存;
同时还有虚拟机栈、本地方法栈和程序计数器,这个称为栈区;
操作系统剩余的内存就是直接内存