Java的JVM学习一

一、java中的内存结构如何划分

栈和堆的区别:

栈负责处理运行,堆负债处理存储。
Java的JVM学习一_第1张图片

区域名称 作用
虚拟机栈 用于存储正在执行的每个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];
    }
}

Java的JVM学习一_第2张图片

详细教程来源:https://zhuanlan.zhihu.com/p/576119507

你可能感兴趣的:(Java相关,java,jvm,学习)