java的栈内存和堆内存_Java本地方法栈

java的栈内存和堆内存_Java本地方法栈Java把内存分成两种,一种叫做栈内存,一种叫做堆内存。在函数中定义的一些基本类型的变量和对象的引用变量都是在函数的栈内存中分配。当在一段代码块中定义一个变量时,java就在栈中为这个变量分配内存空间,当超过变量的作用域后,java会自动释放掉为该变量分配的内存空间,该内存空间可以立刻被另作他用。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新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

这条语句执行完成后的内存状态如图下所示。


java的栈内存和堆内存_Java本地方法栈

这时只声明了数组,而没有对其分配内存空间。现在我们为数组元素分配内存空间。

x = new int[10];  //初始化数组

这条语句执行完后的内存状态如图下所示。


java的栈内存和堆内存_Java本地方法栈

声明数组并分配相应的内存空间,引用变量指向数组对象

执行“x=new int[10];”后,在堆内存里创建了一个数组对象,为这个数组对象分配了10个整数单元,并将数组对象赋给了数组引用变量x。引用变量就相当于C语言中的指针变量,而数组对象就是指针变量指向的那个内存块。所以在Java内部还是有指针,只是把指针的概念对用户隐藏起来了,而用户所使用的是引用变量。

用户也可以改变x的值,让它指向另外一个数组对象,或者不指向任何数组对象。要想让x不指向任何数组对象,只需要将常量null赋给x即可。如执行“x = null;”语句后的内存状态如图下所示。


java的栈内存和堆内存_Java本地方法栈

执行完“x = null;”语句后,原来通过new int[10]产生的数组对象不再被任何引用变量所引用,变成了所谓的“垃圾”,直到垃圾回收器来将它释放掉。


感谢大家的耐心阅读,如有建议请私信或评论留言

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/197464.html原文链接:https://javaforall.net

赞 (0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 电阻色环表色环电阻识别表_电阻的色环识别方法

    电阻色环表色环电阻识别表_电阻的色环识别方法色环电阻色环电阻是电子电路中最常用的电子元件,色环电阻就是在普通的电阻封装上涂上不一样的颜色的色环,用来区分电阻的阻值。保证在安装电阻时不管从什么方向来安装,都可以清楚的读出它的阻值。色环电阻的基本单位有:欧姆(Ω)、千欧(KΩ)、兆欧(MΩ)。1兆欧(MΩ)=1000千欧(KΩ)=1000000欧(Ω)。平常使用的色环电阻可以分为四环和五环,通常用四环。其中四环电阻前二环为数字,第三环表

    2022年11月3日
  • JVM 内存结构基于JDK1.8【JVM篇三】

    JVM 内存结构基于JDK1.8【JVM篇三】在我的上一篇文章别翻了,这篇文章绝对让你深刻理解java类的加载以及ClassLoader源码分析【JVM篇二】中,相信大家已经对java类加载机制有一个比较全面的理解了,那么类加载之后,字节码数据在Java虚拟机内存中是如何存放的?Java虚拟机在为类实例或成员变量分配内存是如何分配的?是的,这两个问题就涉及到了JVM内存结构的知识了,那么这篇文章将进行解答。文章目录1、内存结构还…

    2022年5月20日
  • Java实习入职华为,半年后我跑路了

    Java实习入职华为,半年后我跑路了0前言全是干货的技术殿堂文章收录在我的GitHub仓库,欢迎Star/fork:Java-Interview-Tutorialhttps://github.com/Wasabi1234/Java-Interview-Tutorial1何来?我,一个双非本科渣渣,有幸在19届的秋招中得到前东家华为(以下简称hw)的赏识,当时秋招签订就业协议,当时18年10月签订三方后Hr通知说是入了某java部门,之后一系列组织架构调整原因等等让人无法理解的骚操作,最终在毕业前夕的五

    2022年5月15日
  • CUDA编程注意(CUDA编程)

    CUDA编程注意传给CUDA编译器编译的文件里不能包含boost的头文件,会报错。例如xxCUDA.cuh中最好不要包含boost的头文件。CUDA编程中核函数一般写在.cu文件中,也可以使用.cu生成的ptx文件(起到了类似OpenGL中的着色器的作用)添加到C++的程序中,cuda给了一套使用ptx编程的接口,这使得CUDA程序不需要.cu文件。详情见https://www.cnblogs…

    2022年4月17日
  • mysql databasemetadata_DatabaseMetaData的用法(转)

    mysql databasemetadata_DatabaseMetaData的用法(转)一.得到这个对象的实例Connectioncon;con=DriverManager.getConnection(url,userName,password);DatabaseMetaDatadbmd=con.getMetaData();二.方法getTables的用法原型:ResultSetDatabaseMetaData.getTables(Stringcatalog,…

    2022年6月19日
  • 【性能评估】ROC曲线

    【性能评估】ROC曲线1.混淆矩阵(confusionmatrix)   针对预测值和真实值之间的关系,我们可以将样本分为四个部分,分别是:   真正例(TruePositive,TP):预测值和真实值都为1   假正例(FalsePositive,FP):预测值为1,真实值为0 &nbs…

    2022年5月17日

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号