JVM在执行Java程序时,将其管理的内存区域划分成若干个不同的数据区域。
各个区域用途不同,有各自的创建和销毁时间;有些区域随着JVM的启动存在,而有些区域依赖用户线程的启动和结束而建立和销毁。
- 程序计数器(线程隔离 / 线程私有)
- 定义:当前线程所执行字节码的行号指示器。工作时,通过改变此计数器的值来改变选取下一条需要执行的字节码指令。
- 特点:
- 多线程执行时,为了线程切换后能恢复到正确的执行位置,每个线程需要一个独立的程序计数器,各线程技术器之间相互独立——“线程私有”。
- 正在执行的是java方法时,计数器记录的是虚拟机字节码指令的地址;当执行native方法时,计数器为空;无OutOfMemoryError.
- java虚拟机栈(线程隔离 / 线程私有)
- 定义:描述java方法执行时的内存模型——每个方法执行时都会创建一个栈帧,用于存储局部变量;是通常所说的栈内存
- 本地方法栈(线程隔离 / 线程私有)
- 定义:与java虚拟机栈类似,但是针对native方法。
- java堆(所有线程共享)
- 特点: 虚拟机启动时创建,唯一目的就是存放对象实例;由垃圾收集器管理,也称GC推。
- 方法区(所有线程共享)
- 定义:用于存储类型信息,可以理解为类的描述信息(全限定名,访问修饰符,字段,方法等)。
- 线程安全:两个线程企图访问方法区中的同一个类时,只允许一个线程进行加载。
- 存放内容:
- 全限定名:类的全路径名
- 父类全限定名
- 类的类型
- 访问修饰符
- 常量池(字段(成员变量),方法信息,静态变量,类型引用(class))等
- 运行时常量池:方法区的一个部分;Class文件中保存了常量池,存放编译期生成的各种字面量和符号引用。