当前位置: 主页 > JAVA语言

java堆内存和栈内存-Java虚拟机的内存基础知识与内存的区别!!

发布时间:2023-07-07 07:02   浏览次数:次   作者:佚名

一、内存基础知识

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索引上的元素

数组内存结构图_java堆内存和栈内存_用数组存10个数

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);
}

用数组存10个数_数组内存结构图_java堆内存和栈内存