深入理解java虚拟机(1)
java内存区域
Java虚拟机执行java程序时会将管理的内存划分为若干个区域:
1. 程序计数器
程序计数器是一个”线程私有“的内存区域,用于获取下一条需要执行的字节码指令,如分支、循环、跳转等。
2. Java虚拟栈
在Java内存划分的时候,经常会听到将其分为”堆内存“和”栈内存“,这种分法中的”栈内存“就是指Java虚拟栈,更具体点就是Java虚拟栈中的局部变量表部分。——局部变量表存放的是java基本数据类型(如boolean、int等)、对象引用(reference类型,可能是对象起始地址的引用指针、代表对象的句柄或者其他与此对象相关的位置)和returnAddress类型(指向一条字节码指令的地址)。
Java虚拟栈同样也是”线程私有“的内存区域,各个线程互不影响。
3. 本地方法栈
该区域与虚拟机栈所发挥的作用非常相似,只是虚拟机栈为虚拟机执行Java方法服务,而本地方法栈则为使用到的本地操作系统(Native)方法服务。
4. Java堆
Java堆是虚拟机管理的内存中最大的一块,它是被所有线程共享的一块区域,用于存放对象实例,是GC回收的主要区域。
Java堆可以是物理上不连续的内存空间,只要逻辑是连续的即可。
5. 方法区
方法区也是各个线程共享的内存区域,用于存放被虚拟机加载的类信息、常量、静态变量、及时编译器编译后的代码等数据。——在jdk1.7之后,字符串常量重新被移到了堆中。
6. 运行时常量池
运行时常量池属于方法区的一部分,用于存放编译期生成的各种字面量和符号引用。——常量不一定只有运行时才会产生,运行期间也可以放入新的常量,例如String.intern()方法。