大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。
Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺
介绍Java语言有关内存分配的知识。Java语言把内存分为两种:
栈内存
和堆内存
。
栈内存
在方法中定义的一些基本类型的变量
和对象的引用变量
都在方法的栈内存中分配,当在一段代码块中定义一个变量时,Java就在栈内存中为这个变量分配内存空间,当超出变量的作用域后,Java会自动释放掉为该变量所分配的内存空间,该内存空间可以立刻被另作他用。
堆内存
堆内存用来存放由 new
运算符创建的数组或对象
,在堆中分配的内存,由Java虚拟机的垃圾回收器来自动管理。在堆中创建了一个数组或对象后,同时还在栈中定义一个特殊的变量,让栈中的这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或对象的引用变量,引用变量实际上保存的是数组或对象在堆内存中的首地址(也称为对象的句柄),以后就可以在程序中使用栈的引用变量来访问堆中的数组或对象。
引用变量是普通的变量,定义时在栈中分配,引用变量在程序运行到其作用域之外后被释放。引用变量就相当于是为数组或对象起的一个名称。而数组或对象本身在堆内存中分配,即使程序运行到使用 new
运算符创建数组或对象的语句所在的代码块之外,数组或对象本身所占据的内存也不会被释放,数组或对象在没有引用变量指向它时,会变为垃圾,不能再被使用,但仍然占据内存空间不放,在随后一个不确定的时间被垃圾回收器收走(释放掉),这也是Java比较占内存的原因。
Java有一个特殊的引用型常量null
,如果将一个引用变量赋值为null
,则表示该引用变量不指向(引用)任何对象。
下面通过一个数组案例进行演示,以对栈内存和堆内存有更深的了解。
一维数组是最简单的数组,其逻辑结构是线性表。要使用一维数组,需要先声明数组;分配空间;创建数组元素并赋值。
数据类型 [] 数组名; //声明一维数组
数组名 = new 数据类型[个数]; //分配内存给数组
在数组的声明格式里,“数据类型”是声明数组元素的数据类型,可以是Java语言中任意的数据类型,包括基本类型和引用类型。
与C/C++语言不同,Java语言在数组的定义中并不为数组元素分配内存,因此“[]”
中不用给出数组中元素的个数(即数组的长度),但必须在为它分配内存空间后才可使用。
数组声明之后,接下来就要分配数组所需的内存,这时必须用运算符new
,利用new
运算符为数组元素分配内存空间的方式称为动态内存分配方式
。
int [] x; //声明名称为x的int型数组
x = new int[10]; //x数组中包含有10个元素,并为这10元素分配内存空间
在声明数组时,也可以将两个语句合并成一行,格式如下:
数据类型 [] 数组名 = new 数据类型[个数];
int [] x = new int[10];
等号左边的 “int [] x ”
相当于定义了一个特殊的变量x,x的数据类型是一个对 int
型数组对象的引用,x就是一个数组的引用变量,其引用的数组元素个数不定。等号右边的 “new int[10]”
就是在堆内存中创建一个具有10个int型变量的数组对象。其意义就是将右边的数组对象赋值给左边的数组引用变量。
这里我们先声明一个数组,例如:
int [] x; //定义了一个数组x
这条语句执行完成后的内存状态如图下所示。
这时只声明了数组,而没有对其分配内存空间。现在我们为数组元素分配内存空间。
x = new int[10]; //初始化数组
这条语句执行完后的内存状态如图下所示。
声明数组并分配相应的内存空间,引用变量指向数组对象
执行“x=new int[10];”
后,在堆内存里创建了一个数组对象,为这个数组对象分配了10个整数单元,并将数组对象赋给了数组引用变量x。引用变量就相当于C语言中的指针变量,而数组对象就是指针变量指向的那个内存块。所以在Java内部还是有指针,只是把指针的概念对用户隐藏起来了,而用户所使用的是引用变量。
用户也可以改变x的值,让它指向另外一个数组对象,或者不指向任何数组对象。要想让x不指向任何数组对象,只需要将常量null
赋给x即可。如执行“x = null;”
语句后的内存状态如图下所示。
执行完“x = null;”
语句后,原来通过new int[10]产生的数组对象不再被任何引用变量所引用,变成了所谓的“垃圾”,直到垃圾回收器来将它释放掉。
感谢大家的耐心阅读,如有建议请私信或评论留言
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/197464.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...