一、java中的内存结构如何划分
栈和堆的区别:
栈负责处理运行,堆负债处理存储。
区域名称 | 作用 |
---|---|
虚拟机栈 | 用于存储正在执行的每个Java方法,以及其方法的局部变量表等。局部变量表存放了便器可知长度的各种基本数据类型,对象引用,方法执行完,自动释放 |
堆内存 | 存储对象(包括数组对象),new来创建的,都存储在堆空间 |
方法区 | 存储已被虚拟机加载的类信息,常量,(静态变量)、即时编译器编译后的代码等数据 |
本地方法栈 | 当程序中调用了native的本地方法,底层C的库时,本地方法执行期间的内存区域 |
程序计数器 | 程序计数器是CPU中的寄存器,它包含每个线程下一条要执行的指令的地址 |
****例1:**
1、左边int[]声明的变量**arr**
是放在**虚拟机栈**
中
2、右侧new出来的数组内容是放在**堆内存**
中
class TestJvm {
public static void main(String[] args) {
//左边声明的局部变量arr,是放在虚拟机栈,右边new出来的内容放在堆空间
int[] arr = new int[]{1,2,3};
}
}
举例2:
1、在虚拟机栈创建一个int类型的数组arr1,并在内存堆中创建长度为4的空间,初始值都为0。arr1指向堆空间的首地址0x12ab
2、数组arr1在内存堆中,将索引为0的元素设置为1,索引为1的元素设置为2。
3、在虚拟机栈创建一个String类型的数组arr2,并在内存堆中创建长度为2的空间,初始值都为null。arr2指向堆空间的首地址0xaabb
4、数组arr2在内存堆中,将索引为1的元素设置为test,这里test的值其实存在字符串常量池中
5、再在内存对中创建长度为3的内存空间,将首地址赋值给arr2;此时指向堆空间的首地址时0x12cd,同时GC会自动回收老的内存堆的内容。
class TestArrayJvm {
public static void main(String[] args) {
int[] arr1 = new int[4];
arr1[0] = 1;
arr2[1] = 2;
String[] arr2 = new String[2];
arr2[1] = "test";
//重新开辟堆空间将字符串数组赋值给arr2
arr2 = new String[3];
}
}
详细教程来源:https://zhuanlan.zhihu.com/p/576119507