一、运行时数据区
Java虚拟机运行时数据区
- 程序计数器:是一块较小的内存空间,可以看做当前线程所执行的字节码的行号指示器。在虚拟机的概念模型里,字节码解释器工作就是通过改变这个计数器的值来获取下一条执行的字节码指令。
每个线程都有一个程序计数器
如果执行的是Java方法,计数器记录的是正在执行的虚拟机字节码指令的地址,如果是native方法,计数器的值是空(undefined)- Java虚拟机栈:也是线程私有的。虚拟机栈描述的是Java方法执行的内存模型:每个方法被执行的时候都会同时创建一个栈帧用于存储局部变量表、操作栈、动态链接、方法出口等信息。
这个区域会抛出两种异常:StackOverflowError、OutOfMemoryError。- 本地方法栈:与虚拟机栈作用相似,本地方法栈是为虚拟机使用到的Native方法服务。这个区域会抛出两种异常:StackOverflowError、OutOfMemoryError。
- Java堆:Java堆是所有线程共享的区域,在虚拟机启动时创建,此区域主要是存放对象实例。Java堆是垃圾收集器管理的主要区域。
- 方法区:也是线程共享的内存区域,用于存储已经被虚拟机加载的类信息、常量、静态变量、即使编译器编译后的代码等数据。这个区域会抛出异常:OutOfMemoryError。
- 运行时常量池:是方法区的一部分,用于存放编译期生成的各种字面量和符号引用,这部分内容在类加载后存放在方法区的运行时常量池中。这个区域会抛出异常:OutOfMemoryError。
参考《深入理解JAVA虚拟机》
网友评论