java堆内存和栈内存-Java虚拟机的内存基础知识与内存的区别!!
一、内存基础知识
1、内存概述
计算机中有两个重要的存储区域:硬盘和内存。
硬盘是计算机中的重要组件,作用是用来保存各类文件。
内存是计算机中的重要组件,它是临时存储区域,作用是运行程序。不管是已经存在的程序还是我们编写的java程序都是存放在硬盘中的,而在硬盘中的程序是不会运行的,如果需要程序运行,就必须将程序加载到内存中才能运行,运行完毕后会清空内存。
Java虚拟机要运行java程序,就必须要对内存进行空间的分配和管理。从而提高运行效率。
2、Java虚拟机的内存划分
为了提高运算效率,jvm就对空间进行了不同区域的划分,每一片区域都有特定的处理数据方式和内存管理方式。
区域名称
作用
寄存器
给CPU使用,和我们开发无关
本地方法区
JVM在使用操作系统功能的时候使用,例如native修饰的内容,和我们开发无关
方法区
存储可以运行的class文件
存储对象或者数组,new来创建的,都存储在堆内存
栈内存
方法运行时使用的内存,比如main方法运行,进入栈内存中执行
栈内存:栈内存主要是用来运行方法的,所有的方法都必须在栈内存中运行
方法进栈:方法一旦被调用,就会加载到栈内存中去运行,这个过程我们叫做方法进栈。而且JVM只会运行处于栈内存顶部的方法
方法出栈:当方法执行结束之后就会从栈内存中消失,这个过程我们叫做方法的出栈(弹栈)。
栈内存中的变量细节:在方法中定义的所有变量,都会在这个方法所在的内存中开辟空间。在栈内存中定义的变量,不初始化,是不能直接使用的。
堆内存:在程序中使用new 关键字创建出来的所有东西(特殊定义格式除外),都会保存在堆内存中。并且有系统分配的唯一的内存地址
堆内存中的变量细节:堆内存中开辟的空间,都会有默认的初始化数据。因此可以直接使用。
方法区:JVM在加载class文件时,所有的class文件都会被加载到方法区中
二、数组在内存中的存储
1、一个数组的内存示意图
public static void main(String[] args) {
int[] arr = new int[3];
System.out.println(arr);//[I@5f150435
}
以上方法执行java堆内存和栈内存java堆内存和栈内存,输出的结果是[I@5f150435,这个是什么呢?是数组在内存中的地址。new出来的内容,都是在堆内存中存储的,而堆内存中开辟的每个空间都会有一个唯一的内存地址。而=号左侧的变量arr中保存的是数组的地址
输出arr[0],就会输出arr保存的内存地址中数组中0索引上的元素
2、两个数组的内存示意图
public static void main(String[] args) {
int[] arr1 = new int[3];
int[] arr2 = new int[2];
System.out.println(arr);
System.out.println(arr2);
}