java内存区域—深入理解Java虚拟机学习笔记
程序计数器 program counter register :当前线程所执行的字节码的行号解释器,通过改变这个计数器的值来选取下一条需要执行的字节码指令。如果线程正在执行的是一个Java方法,这个计数器记录的是正在执行的虚拟机字节码指令的地址;如果正在执行的是native方法,这个计数器的值即为null,这个区域不规定内存溢出的情况。线程私有。
虚拟机栈:描述java方法执行的内存模型,每个方法的执行同时都会创建一个栈帧(stack frame),存储局部变量表(基本数据类型,引用,returnAddress),操作数栈,动态链接,方法出口等信息。每个方法从调用到执行完成都相应的有一个栈帧在虚拟机栈中入栈和出栈。其中局部变量表中的内存空间在编译期就分配好了,运行期不会改变内存空间的大小。线程私有。
本地方法栈:描述native方法执行的内存模型。
Java堆 java heap:是虚拟机管理的内存中最大的区域,在虚拟机启动的时候创建,几乎所有的对象实例都在这里分配内存。也是垃圾回收器的管理区域,也称为GC堆,可以按照分代收集算法进一步细分(新生代,老年代等)。
方法区: method area :存储已经被虚拟机加载的类信息,常量,静态变量,即时编译器编译后的代码等。
运行时常量池 runtime constant pool:是方法区的一部分,字节码文件中除了有类的描述信息外,还有一项信息是常量池,用于存放编译期生成的各种字面量和符号引用,这部分内容在类加载后进入运行时常量池。运行时常量池同样具备动态性,在编译期和运行期都可以将对象放入常量池中。(例如 String intern()方法)